使用yield时,在哪个事件循环中运行协程?

时间:2016-06-13 12:05:45

标签: python python-3.x python-asyncio

当我在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 coroutineresult = yield from coroutine - 等待   另一个协同程序产生一个结果(或提出异常,其中   将被传播)。 coroutine表达式必须是对...的调用   另一个协程。

我不清楚将在哪个循环中安排协程。

1 个答案:

答案 0 :(得分:3)

引用get_event_loop

的文档
  

获取当前上下文的事件循环。

default loop的实施(确切地说,事件循环默认政策):

  

默认策略将上下文定义为当前线程,并管理每个与asyncio交互的线程的事件循环。

  • 事件循环在一个线程中运行,并在同一个线程中执行所有回调和任务(docs),

  • asyncio.get_event_loop为同一个帖子返回相同的循环,

  • 如果您没有明确安排/与不同线程的循环互动,它将使用默认( * )循环

在你的例子中:

  1. get_event_loop返回当前线程的事件循环,

  2. foo计划在该循环中使用run_until_completed

  3. 在同一循环上安排任何进一步的异步调用(等待/收益)

  4. Concurrency and multithreading的更多信息。

    * )您调用 default 的事件循环实际上是当前线程的循环。