给定以下最小示例:
@asynccontextmanager
async def async_context():
try:
yield
finally:
await asyncio.sleep(1)
print('finalize context')
async def async_gen():
try:
yield
finally:
await asyncio.sleep(2)
# will never be called if timeout is larger than in async_context
print('finalize gen')
async def main():
async with async_context():
async for _ in async_gen():
break
if __name__ == "__main__":
asyncio.run(main())
我正在break
迭代异步生成器,我希望 finally 块在我的异步上下文管理器finally
块运行之前完成。在此示例"finalize gen"
中,将永远不会打印,因为程序在此之前退出。
请注意,我故意2
在生成器finally
块中选择了超时,以便上下文管理器finally
有机会在之前运行。如果我选择1
了两个超时,则将打印两条消息。
这是一种竞赛条件吗?我希望finally
在程序完成之前完成所有块。
如何防止上下文管理器块finally
在生成器块完成之前运行finally
?
对于上下文:
我使用剧作家来控制铬浏览器。外部上下文管理器提供它在finally
块中关闭的页面。
我正在使用 python 3.9.0
。
试试这个例子:https ://repl.it/@trixn86/AsyncGeneratorRaceCondition