python-使用yield from时协程在哪个事件循环中运行?
作者:互联网
当我在couroutine foo中从some_coroutine()中调用yield时,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())
在此示例中,将在哪个事件循环中安排睡眠时间?我对循环不是默认事件循环的情况特别感兴趣.
documentation,在“协程可以做的事情”下说:
result = await coroutine
orresult = yield from coroutine
– wait for
another coroutine to produce a result (or raise an exception, which
will be propagated). Thecoroutine
expression must be a call to
another coroutine.
我不清楚协程将在哪个循环中进行调度.
解决方法:
get_event_loop
的引用文档
Get the event loop for the current context.
default loop的实现(准确地说是事件循环默认策略):
The default policy defines context as the current thread, and manages an event loop per thread that interacts with asyncio.
>事件循环在线程中运行,并在同一线程中执行所有回调和任务(docs),
> asyncio.get_event_loop为相同的线程返回相同的循环,
>如果您未明确安排其他线程的循环/与之交互,它将使用默认(*)循环
在您的示例中:
> get_event_loop返回当前线程的事件循环,
> foo被安排在具有run_until_completed的循环上
>任何其他异步调用(从中唤醒/产生)都安排在同一循环中
有关更多信息,请访问Concurrency and multithreading.
(*)您称为default的事件循环实际上是当前线程的循环.
标签:python-3-x,python-asyncio,python 来源: https://codeday.me/bug/20191118/2028916.html