V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
awanganddong
V2EX  ›  PHP

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

  •  
  •   awanganddong · 2021-03-26 18:54:05 +08:00 · 2102 次点击
    这是一个创建于 1338 天前的主题,其中的信息可能已经有所发展或是发生改变。
    1.迭代器是一个接口,内部定义了一些方法。生成器是一种特殊的迭代器,生成器自动实现了“迭代器协议”(即__iter__和 next 方法),不需要再手动实现两方法。(这种说法不知道对不对)
    
    2.php 协程的实现通过 yield 和 generator 。generator 提供了一种方便的实现简单的 Iterator (迭代器)的方式,使用 Generator 实现 Iterator 不需要创建一个类来继承 Iterator 接口。(对这个具体实现,能用大白话讲下吗)
    
    3.Generator (无堆栈轻量级并发实现)这里无堆栈轻量级会存在什么缺陷?
    
    
    
    6 条回复    2021-03-29 00:45:04 +08:00
    SimbaPeng
        1
    SimbaPeng  
       2021-03-26 19:13:12 +08:00
    这不是 Python?
    awanganddong
        2
    awanganddong  
    OP
       2021-03-26 19:15:12 +08:00
    参考 在 PHP 中使用协程实现多任务调度

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


    有些含义在 php 哪里不好找,就去看看隔壁 python 的理解,应该大同小异。
    awanganddong
        3
    awanganddong  
    OP
       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
        4
    awanganddong  
    OP
       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
        5
    awanganddong  
    OP
       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 的值
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2764 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 09:55 · PVG 17:55 · LAX 01:55 · JFK 04:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.