【发布时间】:2020-01-31 00:33:26
【问题描述】:
我想知道当事件循环切换任务时,python 提供了什么保证。
据我了解,async / await 与线程有很大不同,因为事件循环不会根据时间片切换任务,这意味着除非任务产生 (await),否则它将无限期地进行.这实际上很有用,因为在 asyncio 下管理关键部分比使用线程更容易。
我不太清楚的是以下内容:
async def caller():
while True:
await callee()
async def callee():
pass
在此示例中,caller 重复出现 await。所以从技术上讲,它正在屈服。但我不清楚这是否会允许事件循环上的其他任务执行,因为它只屈服于callee,而且永远不会屈服。
也就是说,如果我在“关键部分”内等待callee,即使我知道它不会阻塞,我是否有可能发生其他意外情况?
【问题讨论】:
-
async/await 不做并发,只是协程。事件循环必须决定是否以及如何调度协程。您是否考虑过特定的事件循环(asyncio、trio、curio、...)?
-
这可能会回答你的问题:how does asyncio actually work
-
协程不能自行停止——它们不能
yield进入事件循环。需要自定义__await__,这些通常随事件循环一起提供。协程只是创建从事件循环到yields 的叶子的连接。 -
@MisterMiyagi 从来没有;它是协程负责,不是事件循环。事件循环在何时发生 yield 时没有发言权,如果协程什么都不等待,它确实有一些控制权。您的第一条评论具有误导性,因为这不是关于事件循环行为的问题,而是协程机制的行为。
标签: python async-await