Python多处理脚本在运行几个小时后就会死机

时间:2014-08-22 02:46:53

标签: python multiprocessing

我有一个运行正常的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)

1 个答案:

答案 0 :(得分:1)

问题是您在while循环中重复创建新的Pool个对象。相反,在while循环之外创建一次,然后重复调用pool.map。这意味着在程序的整个生命周期中使用相同的8个进程,而不是一个新的8个进程不断启动。