tasks = set()
t = asyncio.create_task(worker())
tasks.add(t)
t.add_done_callback(tasks.discard)
await asyncio.gather(*tasks)

程序退出时控制台刷 Task was destroyed but it is pending,后面跟着一串协程名,那些任务里的收尾逻辑一条都没有执行,连接也没有关。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,create_task 创建的任务只被局部变量引用,函数返回后引用就消失了,循环关闭时任务还没跑完,被垃圾回收直接销毁,finally 也不会被执行。

「Task 未等待」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。

一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。

处理上按这个顺序:把创建出来的任务放进一个集合,任务完成之后再从集合里移除;在退出前用 gather 等这批任务结束,别直接让循环关掉;收尾逻辑放在 finally 里,别依赖任务能按顺序自然跑完。

改完只确认一件事:进程退出时不再打印 pending 警告,每个任务的 finally 都执行到,连接也正常释放。

作者 9823189