如何检测任务组取消任务

问题描述 投票:0回答:1

给定

taskgroup
和正在运行的任务数量,根据 taskgroup 文档,如果任何任务引发错误,组中的其余任务将被取消。

如果其中一些任务需要在取消时执行清理,那么如何检测在任务中它正在被取消

希望在任务中引发一些异常,但事实并非如此:

脚本.py:

import asyncio

class TerminateTaskGroup(Exception):
    """Exception raised to terminate a task group."""

async def task_that_needs_to_cleanup_on_cancellation():
    try:
        await asyncio.sleep(10)
    except Exception:
        print('exception caught, performing cleanup...')


async def err_producing_task():
    await asyncio.sleep(1)
    raise TerminateTaskGroup()


async def main():
    try:
        async with asyncio.TaskGroup() as tg:
            tg.create_task(task_that_needs_to_cleanup_on_cancellation())
            tg.create_task(err_producing_task())
    except* TerminateTaskGroup:
        print('main() termination handled')

asyncio.run(main())

执行,我们可以看到

task_that_needs_to_cleanup_on_cancellation()
中没有引发异常:

$ python3 script.py 
main() termination handled
python task python-asyncio
1个回答
0
投票

随便,我可能会避免这样故意取消任务组的设计

  • 异常的顺序和时间很难预测
  • 潜在的尴尬清理
  • 取消期间创作的新作品

但是,您可以排除

asyncio.CancelledError
或使用
finally

async def task_that_needs_to_cleanup_on_cancellation():
    try:
        await asyncio.sleep(10)
    except asyncio.CancelledError:
        print('exception caught, performing cleanup...')
© www.soinside.com 2019 - 2024. All rights reserved.