如果当前任务不是子任务,则取消asyncio.Task

时间:2019-08-26 15:09:27

标签: python python-asyncio

我希望能够在触发新任务时取消当前正在运行的asyncio.Task(请参阅[1])。但是,有时任务可能会触发新功能,并用asyncio.gather将它们包装到新任务中。我需要一种方法来确定当前任务是否已由父任务触发。否则,新任务可能会通过杀死其父任务来取消自身(请参见[2])。 asyncio的功能是否可以防止这种情况?您知道更好的模式来处理此类问题吗?

import asyncio


task_monitor = []


async def run_task(func):
    t = asyncio.current_task()
    if t not in task_monitor:
        for task in task_monitor:
            if not task.done():
                task.cancel()

    new_task = asyncio.create_task(func())
    task_monitor.append(new_task)
    try:
        res = await new_task
        print(res)
    except asyncio.CancelledError:
        pass

async def do_forever():
    await asyncio.sleep(3600)
    return "Task Done"

async def do_A():
    await asyncio.sleep(0.1)
    return "A done"


async def do_B():
    # await run_task(do_A)
    await asyncio.gather(run_task(do_A))
    return "B done"

# [1]
# do_forever is already running when run_task(do_A) is triggered
asyncio.get_event_loop().run_until_complete(asyncio.gather(run_task(do_forever), run_task(do_A)))
# >>> A Done

# [2]
asyncio.get_event_loop().run_until_complete(run_task(do_B))
# expected: >>> A Done \n B Done
# actual: >>>

0 个答案:

没有答案