我尝试map_async一个函数的对象列表。由于在函数中,将执行一些数据库插入,我必须终止池以确保数据库连接被终止(之前我没有这样做,我得到了错误'太多连接' for MySQL的)。这将在for循环中迭代,如:
for name in names:
data = prepare_data(name)
p = Pool(8)
res = p.map_async(target, data)
res.get(timeout=300)
p.terminate()
在大多数情况下,这些代码运行良好。终止池后,将清除多个子进程中的数据库连接。虽然在某些情况下,最后一个循环中的任务仍在进行(日志显示数据库插入正在进行),而prepare_data()也开始执行。日志显示prepare_data()和map_async中的目标函数正在同时执行。
这看似有线,因为如果在最后一个循环中,池已经终止,那么在当前循环中,当prepare_date时,我不能在目标函数中看到任何日志信息。
答案 0 :(得分:1)
您需要加入Pool以等待其清理。
由于您没有加入Pool,您的软件退出的速度太快,子进程突然终止。