小编Jim*_*eld的帖子

为什么`asyncio.run()` 在 Python 3.8 中永远不会返回?

我的应用程序具有以下顶级代码(略有缩写):

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")
Run Code Online (Sandbox Code Playgroud)

在 Python 3.8 中asyncio.run永远不会完成,因此清理代码不会运行(并且不会打印关闭文本)。当应用程序应该退出时,它只是永远挂起。在 Python 3.7 中它运行良好。Python的3.6没有asyncio.run,但相当类似的代码loop.run_until_complete()loop.close()工作过。

一些额外的上下文:设置和清理代码启动并优雅地退出使用threading.Thread. 正是这个线程实际上停止了主协程:它取消了协程(从技术上讲,它取消了在 内调用的另一个协程my_coroutine()loop.call_soon_threadsafe

python exception cancellation python-asyncio

3
推荐指数
1
解决办法
687
查看次数

标签 统计

cancellation ×1

exception ×1

python ×1

python-asyncio ×1