【发布时间】:2020-05-26 18:59:51
【问题描述】:
我的应用程序有以下顶级代码(略略):
def main():
# Some setup code ...
try:
asyncio.run(my_coroutine())
except Exception as e:
print("Exiting due to exception {}: {}".format(type(e).__name__, e))
print("Coroutine finished")
# Some cleanup code ...
print("Shutdown complete")
在 Python 3.8 中,asyncio.run 永远不会完成,因此清理代码不会运行(并且不会打印关闭文本)。当应用程序应该退出时,它只是永远挂起。在 Python 3.7 中它运行良好。 Python 3.6 没有asyncio.run,但与loop.run_until_complete() 和loop.close() 相当相似的代码也可以工作。
一些额外的上下文:设置和清理代码启动并优雅地退出使用threading.Thread 创建的工作线程。正是这个线程真正停止了主协程:它使用loop.call_soon_threadsafe取消了协程(从技术上讲,它取消了在my_coroutine()中调用的另一个协程)
【问题讨论】:
标签: python exception python-asyncio cancellation