Python 3.x Python asyncio:如果任务引发异常,请立即退出程序

Python 3.x Python asyncio:如果任务引发异常,请立即退出程序,python-3.x,python-asyncio,Python 3.x,Python Asyncio,我使用asyncio.create_task()创建了数量可变的长时间运行任务。如果这些任务中的任何一项引发异常,我希望立即优雅地退出我的程序。我无法asyncio.wait()处理这些任务,因为并非所有任务都是同时创建的(一些正在运行的任务会根据需要在不同的时间创建新任务) 我的想法是使用Task.add_done_callback()在任务完成时收到通知,但Python文档建议这只应用于低级回调代码,是否有其他选择?如果您控制创建任务的代码,您可以包装任务协程以捕获异常并根据需要处理失败。例

我使用asyncio.create_task()创建了数量可变的长时间运行任务。如果这些任务中的任何一项引发异常,我希望立即优雅地退出我的程序。我无法asyncio.wait()处理这些任务,因为并非所有任务都是同时创建的(一些正在运行的任务会根据需要在不同的时间创建新任务)


我的想法是使用Task.add_done_callback()在任务完成时收到通知,但Python文档建议这只应用于低级回调代码,是否有其他选择?

如果您控制创建任务的代码,您可以包装任务协程以捕获异常并根据需要处理失败。例如,如果任务是这样创建的:

# let some_coro() run unattended
asyncio.create_task(some_coro())
您可以按如下方式对其进行修改:

async def run_guarded(aw):
    try:
        await aw
    except:
        import traceback, sys
        traceback.print_exc()
        sys.exit(1)

asyncio.create_task(run_guarded(some_coro()))
如果无法修改生成任务的位置,则需要使用
add\u done\u callback
。不要担心它是“低级的”,这个警告只是为了防止回调的过度使用,并在可能的情况下将用户推向
wait
ing。这种用例是
add\u done\u callback
所擅长的

def check_error(t):
    if not t.cancelled() and t.exception() is not None:
        import traceback, sys
        e = t.exception()
        traceback.print_exception(None, e, e.__traceback__)
        sys.exit(1)

# task previously created with create_task()
task.add_done_callback(check_error)

谢谢你的回答。你让我放心使用回调。