我希望能够在触发新任务时取消当前正在运行的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: >>>