我有一个运行正常的 python3.4 多处理脚本,然后在我身上消失了。例如,它运行了大约 4 个小时,然后当我回到它时,我发现它不再处理。
与之前相比,Top 现在显示在后台运行的大量进程。我点了它们,发现了一堆python3.4进程。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
13322 root 20 0 888716 316456 3272 S 0.0 7.8 0:27.09 python3.4
13325 root 20 0 888480 316212 3272 S 0.0 7.8 0:26.54 python3.4
13327 root 20 0 873136 300836 3272 S 0.0 7.4 0:14.83 python3.4
13309 root 20 0 651924 299896 3244 S 0.0 7.4 0:23.38 python3.4
13305 root 20 0 651924 299888 3244 S 0.0 7.4 0:22.17 python3.4
13287 root 20 0 1055324 46800 6268 S 0.0 1.2 0:03.97 python3.4
13414 root 20 0 834128 41344 3264 S 2.3 1.0 0:01.92 python3.4
13415 root 20 0 834128 41344 3264 S 2.0 1.0 0:01.82 python3.4
13416 root 20 0 834128 41344 3264 S 2.0 1.0 0:01.85 python3.4
13417 root 20 0 834128 41344 3264 S 2.0 1.0 0:01.88 python3.4
13418 root 20 0 834128 41344 3264 S 2.3 1.0 0:01.86 python3.4
13419 root 20 0 834128 41344 3264 S 2.7 1.0 0:01.89 python3.4
13420 root 20 0 834128 41344 3264 S 2.0 1.0 0:01.83 python3.4
#About 60 others truncated for brevity
13293 root 20 0 165356 31632 3260 S 0.0 0.8 0:02.46 python3.4
13291 root 20 0 165364 31592 3256 S 0.0 0.8 0:02.37 python3.4
13295 root 20 0 165356 31584 3256 S 0.0 0.8 0:02.44 python3.4
下面是开始处理的设置代码。我使用 top 观察到,在每次后续调用 process_score
时,现有的 python3.4 进程仍然存在,并且出现了新的 8 个进程。最终,我认为这些进程会累积并耗尽我的资源并导致主脚本“卡住”。
我认为 pool.map
的部分魔力是在退出时终止子进程,而我不必自己跟踪和终止它们?因此,如何确保子进程终止?在 stackoverflow 中搜索并没有提供太多关于在使用 pool.map 时终止子进程的信息
While True
id_list = get_student_ids()
if id_list == []:
break
else:
#Multiprocessing starts here:
num_of_consumers = multiprocessing.cpu_count()
pool = multiprocessing.Pool(num_of_consumers)
col_list_insert = pool.map(student_score.process_score, id_list)
最佳答案
问题是您在 while 循环中重复创建新的 Pool
对象。相反,在 while 循环之外创建池 一次,然后重复调用 pool.map
。这将意味着在程序的整个生命周期中使用相同的 8 个进程,而不是不断启动一组新的 8 个进程。
关于Python 多处理脚本在运行数小时后死掉,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25438831/