【发布时间】:2020-06-21 11:49:57
【问题描述】:
在python的asyncio异步编程(3.7或以下版本)中,如果我想手动让协程将其控制权交还给主事件循环,我可以使用这段代码:
@asyncio.coroutine
def switch():
yield
return
async def task():
# ...do something
# ...
await switch() # then this coroutine will be suspended and other will be triggered
# ...
# ... do something else when it's triggered again.
但是在 python3.8 中,“@coroutine”装饰器已被弃用。此外,我不能在“async def”中使用yield(因为它将定义一个异步生成器而不是协程)。那么我怎样才能实现同样的功能呢?
【问题讨论】:
-
有什么理由要实现自己的
switch协程吗?实际上,所有事件循环都考虑它们各自的sleep(0)来执行此操作。最重要的是,并非每个事件循环都会正确响应空的yield。 -
@asyncio.coroutine已被弃用,但@types.coroutine不是(也不会是),所以你应该使用它。如果你仔细看,asyncio.sleep在内部也使用了那个。
标签: python python-asyncio