即使终止池,子进程也无法停止运行

时间:2016-09-03 13:54:12

标签: python-2.7 multiprocessing python-multiprocessing

我尝试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时,我不能在目标函数中看到任何日志信息。

1 个答案:

答案 0 :(得分:1)

您需要加入Pool以等待其清理。

由于您没有加入Pool,您的软件退出的速度太快,子进程突然终止。