协程

本文最后更新于:2023年12月5日 晚上

python 中的协程

协程,又称微线程。

def Fn():
    i = 0
    while i < 5:
        yield i
        i ++

f = Fn()
next(f)
next(f)

协程就是通过 yield 关键字返回数据,然后中断函数执行,处理返回的数据,之后使用 next()激活函数,继续执行。

函数每次执行都需要激活,第一次也不例外,除了可以使用 next()激活,还可以使用 send()激活,send()激活的好处就是可以传递参数。next() = f.send(None)

封装

greenlet:为了更好使用协程来完成多任务,python 中的 greenlet 模块对其封装,从而使得切换任务变的更加简单。

gevent:greenlet 已经实现了协程,但是这个还的人工切换,gevent 能够自动切换任务,其原理是当一个 greenlet 遇到 IO(指的是 input output 输入输出,比如网络、文件操作等)操作时,比如访问网络,就自动切换到其他的 greenlet,等到 IO 操作完成,再在适当的时候切换回来继续执行。

不过这两个封装协程的扩展我是没太看懂。

php 中的协程

和 python 中类似,只要函数中包含 yield 关键字,那么它就是协程。

与 python 的协程不同的是第一次激活协程,python 是统一使用 next(), 而 php 是单独定义了一个方法 rewind(), 第一次运行协程一定要通过 rewind()方法, 如果第一次使用 next()、send()、current(), 也会运行协程, 是因为他们已经隐式的运行了 rewind():

<?php
function gen()
{
    yield 'foo';
    yield 'bar';
}

$gen = gen();
$gen->next();	// 等价与 $gen->rewind(); $gen->next(); 同理: $gen->send('xxx'); 等价与 $gen->rewind(); $gen->send('xxx');

所以如果第一次就使用 next(), 得到的结果就是第二次 yield 的返回值了.


协程
http://blog.lujinkai.cn/PHP/基础/协程/
作者
像方便面一样的男子
发布于
2020年12月9日
更新于
2023年12月5日
许可协议