【发布时间】:2017-01-21 23:19:59
【问题描述】:
我有一个关于 python 的asyncio 模块中的事件循环如何管理未完成任务的问题。考虑以下代码:
import asyncio
@asyncio.coroutine
def a():
for i in range(0, 3):
print('a.' + str(i))
yield
@asyncio.coroutine
def b():
for i in range(0, 3):
print('b.' + str(i))
yield
@asyncio.coroutine
def c():
for i in range(0, 3):
print('c.' + str(i))
yield
tasks = [
asyncio.Task(a()),
asyncio.Task(b()),
asyncio.Task(c()),
]
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait([t1, t2, t3]))
运行此程序将打印:
a.0
b.0
c.0
a.1
b.1
c.1
a.2
b.2
c.2
请注意,它总是打印出 'a' 然后 'b' 然后 'c'。我猜无论每个协程经过多少次迭代,它总是会按该顺序打印。所以你永远不会看到类似的东西
b.100
c.100
a.100
来自 node.js 背景,这告诉我这里的事件循环在内部维护一个队列,它用来决定接下来运行哪个任务。它最初将a() 放在队列的前面,然后是b(),然后是c(),因为这是传递给asyncio.wait() 的列表中任务的顺序。然后,每当它遇到一个 yield 语句时,它就会将该任务放在队列的末尾。我想在一个更现实的例子中,假设你正在执行一个异步 http 请求,它会在 http 响应返回后将 a() 放回队列的末尾。
我可以得到一个阿门吗?
【问题讨论】:
标签: python queue python-asyncio event-loop