我知道Python中的coroutine使用get = yield ret
,callee.send()
,callee.next()
。
但我在Tornado源代码 gen.py 中找不到call.send()
之类的内容。
如何用易于理解的方式解释龙卷风中的协程?没有更大的图片,我只是
无法理解龙卷风做了什么。
答案 0 :(得分:1)
send
和next
函数不是Tornado的功能,它们是核心Python的一部分。有关详细信息,请参阅官方文档的PEP 342和this section。
你可以像没有龙卷风一样编写你自己的协同程序:
>>> def f():
... x = 0
... while True:
... x = x*2
... x = yield x
...
>>> coro = f()
>>> coro.next() #need to call 'next' once to start the coroutine
0
>>> coro.send(10)
20
>>> coro.send(100)
200
>>> coro.send(1000)
2000
>>>
龙卷风提供的是一个“事件循环”,它允许您在单个进程中运行一堆协同程序,以便在存在阻塞IO时实现并发。例如,在从数据库读取数据并将结果流式传输到客户端的Web服务器中,每个请求将在单独的协程中运行,龙卷风将通过在点处使用yield / send / next来同时处理所有这些协同程序的执行发生IO的地方。
答案 1 :(得分:1)
gen.py
确实致电send()
,但在Runner.run()
,而不是engine()
或coroutine()
,正如您所料。
似乎engine()
和coroutine()
基本上评估包装函数以查看它是否返回生成器。如果是,则在结果上调用Runner.run()
,内部似乎在send()
上循环。尽管如此......目前还不是很明显......