编程语言
首页 > 编程语言> > python-使用yield from时协程在哪个事件循环中运行?

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 or result = yield from coroutine – wait for
another coroutine to produce a result (or raise an exception, which
will be propagated). The coroutine 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