如何解释Tornado和Python中的协同程序?

时间:2014-03-06 09:47:29

标签: python tornado coroutine

我知道Python中的coroutine使用get = yield retcallee.send()callee.next()。 但我在Tornado源代码 gen.py 中找不到call.send()之类的内容。 如何用易于理解的方式解释龙卷风中的协程?没有更大的图片,我只是 无法理解龙卷风做了什么。

2 个答案:

答案 0 :(得分:1)

sendnext函数不是Tornado的功能,它们是核心Python的一部分。有关详细信息,请参阅官方文档的PEP 342this 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()上循环。尽管如此......目前还不是很明显......