程序处理完一批又提交了收尾任务,主进程随即退出,收尾任务的日志一条都没有,数据库里的状态停在中间态。碰到这种情况,我一般先确认改动有没有真的生效。

原因不复杂,with 块结束会调 shutdown 等待,但如果执行器是手动创建又没调 shutdown,解释器退出时队列里的任务不会被等待,直接被丢弃掉,也不会有报错。

碰到「线程池退出丢任务」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。别只看报错的最后一行,往上看几行,真正的起因通常在上面。

with ThreadPoolExecutor(max_workers=8) as ex:
    futs = [ex.submit(flush, i) for i in range(8)]
for f in futs:
    f.result()

同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。

具体做法是,线程池执行器用 with 管理,代码块结束时会自动等待任务收尾;手动创建的执行器要显式调 shutdown,并把 wait 参数设成真值;关键任务提交后拿到 future,退出前统一取一次结果确认。

最后用这个标准收尾,收尾任务全部留下日志,状态字段推进到最终值,不再停在中间态。

作者 9823189