【发布时间】:2021-05-26 16:26:39
【问题描述】:
给出以下最小示例:
@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())
我是 breaking 在迭代异步生成器时,我希望 finally 块在我的异步上下文管理器 finally 块运行之前完成。在这个例子中,"finalize gen" 永远不会被打印,因为程序在此之前就退出了。
请注意,我故意在生成器 finally 块中选择了 2 的超时,以便上下文管理器 finally 有机会在之前运行。如果我为两个超时都选择了1,则会打印两条消息。
这是一种竞争条件吗?我希望所有 finally 块在程序完成之前完成。
如何防止上下文管理器 finally 块在生成器 finally 块完成之前运行?
对于上下文:
我使用playwright 来控制铬浏览器。外部上下文管理器提供了一个在 finally 块中关闭的页面。
我正在使用 python 3.9.0。
【问题讨论】:
标签: python python-asyncio playwright-python