我正在学习 asyncio 并需要解决以下问题。如果协程完成时间超过 3 秒,则需要完成任务。其余任务必须在10秒后完成(程序总运行时间为10秒)。像这样的代码。
async def some_coro(time):
print(f"Корутина {asyncio.current_task().get_name()} запустилась")
try:
await asyncio.sleep(time)
print(f"Корутина {asyncio.current_task().get_name()} завершилась")
except asyncio.CancelledError:
print(f"Корутина {asyncio.current_task().get_name()} отменена")
async def wait_10():
print('начало отсчета 10 сек')
await asyncio.sleep(10)
print ('10 сек прошло. Завершаем все задачи')
for task in asyncio.all_tasks():
try:
task.cancel()
except asyncio.CancelledError:
pass
async def main():
tasks = [asyncio.create_task(some_coro(12)), asyncio.create_task(some_coro(2)), asyncio.create_task(some_coro(15))]
#await asyncio.create_task(wait_10())
await asyncio.wait(tasks, timeout=5)
asyncio.run(main())
如果我只运行一个 asyncio.wait(tasks, timeout=5)。然后简单地在 5 秒后取消未完成的任务(但没有 10 秒的通用计数器)如果我添加等待 asyncio.create_task(wait_10()),那么似乎 asyncio.wait 中的超时“不再起作用”,并且这对我来说就是全部任务在 10 秒后完成,而不是在 5 秒超时后完成。首先,我想亲自了解为什么会发生这种情况?其次,是否可以制作“两个独立”的计数器?我觉得我缺少一些异步基础知识,想弄清楚。提前致谢。
不,不是任务被取消,而是任务在等待
asyncio.wait。返回两个列表:已完成的任务和未完成的任务。如果您希望
timeout稍后取消任务,请使用asyncio.wait_for,此函数将取消运行时间超过 的任务timeout。当然,这是事实,因为你首先等待任务完成
wait_10,然后下一个等待任务才开始工作,而此时你已经杀死了任务中的所有任务wait_10。顺便说一句,您不加区别地杀死那里的所有任务,包括任务本身wait_10和任何处于活动状态的任务,包括当前任务await。这是一个代码示例,可能会让事情变得更清楚。只是我
main()在这里启动它的方式有点不同,因为我通过Jupyter Notebook,你的启动方法在那里不起作用。是的,同时我纠正了错误,被调用函数的错误名称等。
结论:
我给任务命名是为了区分那些应该强制结束的任务和其他最好不要管的任务。
新增运行任务统计。到最后,等待任务就已经这样了,以防万一。至此,所有的任务都已经强行完成了。