Asyncio协程
我认为我已经用David Beazley的非常好的演示文稿构建了协程,但我无法用PEP-492中描述的新语法完全调和它。
在演讲中,他解释了协程可以被看作是一个被推到的管道,而不是像发电机那样被拉出。
例如:
# cofollow.py
#
# A simple example showing how to hook up a pipeline with
# coroutines. To run this, you will need a log file.
# Run the program logsim.py in the background to get a data
# source.
from coroutine import coroutine
# A data source. This is not a coroutine, but it sends
# data into one (target)
import time
def follow(thefile, target):
thefile.seek(0,2) # Go to the end of the file
while True:
line = thefile.readline()
if not line:
time.sleep(0.1) # Sleep briefly
continue
target.send(line)
# A sink. A coroutine that receives data
@coroutine
def printer():
while True:
line = (yield)
print line,
# Example use
if __name__ == '__main__':
f = open("access-log")
follow(f,printer())
如何使用这种新语法实现printer()
协同程序? 我还没有看到一个协程被推到使用这个新语法的例子。 可能吗?
从asyncio
模块和/或PEP-492的角度来看,你在那里没有一个协同程序。 正如PEP本身所说:
[此PEP]仅与使用yield
作为调度程序信号的协程类型有关,表明协程将等待事件(如IO)完成。
yield
“作为调度器的信号”; 它真的用它来读取数据。 上一篇: Asyncio coroutines