请教下 PHP 关于协程的一些知识

2021-03-26 18:54:05 +08:00
 awanganddong
1.迭代器是一个接口,内部定义了一些方法。生成器是一种特殊的迭代器,生成器自动实现了“迭代器协议”(即__iter__和 next 方法),不需要再手动实现两方法。(这种说法不知道对不对)

2.php 协程的实现通过 yield 和 generator 。generator 提供了一种方便的实现简单的 Iterator (迭代器)的方式,使用 Generator 实现 Iterator 不需要创建一个类来继承 Iterator 接口。(对这个具体实现,能用大白话讲下吗)

3.Generator (无堆栈轻量级并发实现)这里无堆栈轻量级会存在什么缺陷?


1980 次点击
所在节点    PHP
6 条回复
SimbaPeng
2021-03-26 19:13:12 +08:00
这不是 Python?
awanganddong
2021-03-26 19:15:12 +08:00
参考 在 PHP 中使用协程实现多任务调度

https://www.laruence.com/2015/05/28/3038.html


有些含义在 php 哪里不好找,就去看看隔壁 python 的理解,应该大同小异。
awanganddong
2021-03-27 00:24:51 +08:00
```
function gen($max)
{
for ($i=0; $i<$max; $i++) {
yield $i;
}
}

$gen = gen(5);

foreach ($gen as $key=>$val) {
var_dump($key . "=>" . $val);
}

//以下是对应的输出值
string(4) "0=>0"
string(4) "1=>1"
string(4) "2=>2"
string(4) "3=>3"
string(4) "4=>4"

```

yield 具体的执行流程可以参考这个帖子

## PHP 生成器--动态生成内容的数组
https://segmentfault.com/a/1190000015149274
awanganddong
2021-03-27 00:34:19 +08:00
```
<?php

function gen($max)
{
for ($i=0; $i<$max; $i++) {
yield $i=>$i+1; (注意这里是=>,而不是=号。这里为什么不能是等号暂时不明)
}
}

$gen = gen(5);

foreach ($gen as $key=>$val) {
var_dump($key . "=>" . $val);
}

//以下是输出的值

string(4) "0=>1"
string(4) "1=>2"
string(4) "2=>3"
string(4) "3=>4"
string(4) "4=>5"


```
awanganddong
2021-03-27 09:56:48 +08:00
```
function gen() {
$ret = (yield 'yield1');
var_dump($ret);
echo 'A1111'.PHP_EOL;
$ret = (yield 'yield2');
echo "B1111".PHP_EOL;
}
$gen = gen();
var_dump($gen->current());
echo 'A'.PHP_EOL;
var_dump($gen->send('ret1'));
echo 'B'.PHP_EOL;

string(6) "yield1"
A
string(4) "ret1"
A1111
string(6) "yield2"
B
```
上边这个不太理解的点是$gen->send()这里
//结论
send 方法将自己的发送的值传递给上一个 yield 表达式的结果,
然后继续隐式的继续执行下一个 yield 并接收下一个 yield 的值
rqrq
2021-03-29 00:45:04 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/765515

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX