协程
python 中的协程
协程,又称微线程。
1 | def Fn(): |
协程就是通过 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():
1 |
|
所以如果第一次就使用 next(), 得到的结果就是第二次 yield 的返回值了.