我有一个运行正常的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个进程。最终,我认为这些过程会累积起来并耗尽我的资源并导致主要脚本“冻结”#34;。
我的想法是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)
答案 0 :(得分:1)
问题是您在while循环中重复创建新的Pool
个对象。相反,在while循环之外创建一次池,然后重复调用pool.map
。这意味着在程序的整个生命周期中使用相同的8个进程,而不是一个新的8个进程不断启动。