当我在couroutine yield from some_coroutine()
中调用foo
时,some_coroutine
是否安排在当前正在运行foo
的同一个偶数循环中?一个例子:
async def foo():
yield from asyncio.sleep(5)
loop = asyncio.get_event_loop() # this could also be a custom event loop
loop.run_until_completed(foo())
在此示例中,将在哪个事件循环中安排sleep
?我对loop
不是默认事件循环的情况特别感兴趣。
“协程可以做的事情”下的documentation 说:
result = await coroutine
或result = yield from coroutine
- 等待 另一个协同程序产生一个结果(或提出异常,其中 将被传播)。coroutine
表达式必须是对...的调用 另一个协程。
我不清楚将在哪个循环中安排协程。
答案 0 :(得分:3)
获取当前上下文的事件循环。
default loop的实施(确切地说,事件循环默认政策):
默认策略将上下文定义为当前线程,并管理每个与asyncio交互的线程的事件循环。
事件循环在一个线程中运行,并在同一个线程中执行所有回调和任务(docs),
asyncio.get_event_loop
为同一个帖子返回相同的循环,
如果您没有明确安排/与不同线程的循环互动,它将使用默认( * )循环
在你的例子中:
get_event_loop
返回当前线程的事件循环,
foo
计划在该循环中使用run_until_completed
在同一循环上安排任何进一步的异步调用(等待/收益)
Concurrency and multithreading的更多信息。
( * )您调用 default 的事件循环实际上是当前线程的循环。