Python 多处理脚本在运行数小时后死掉

标签 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 个进程。最终,我认为这些进程会累积并耗尽我的资源并导致主脚本“卡住”。

我认为 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/

相关文章:

python - 从以字典格式接收的 API 中清理原始价格数据 (Python)

python - 将python输出保存为pdf?

python - BigramTagger 工作是否需要最小数据大小?

python - multiprocessing.Manager 嵌套共享对象不适用于 Queue

python - 如何在 Multiprocessing 中捕获 worker 中的异常

python - 我如何在 Python 中接收来自 IBs API 的数据?

python - 使用 Gekko 求解固定端点的最优控制

Python MongoDB (PyMongo) 多重处理游标

python - 在python多处理中实现Ctrl+C取消

python - LSF:提交一个使用多处理器模块的 Python 脚本 * 或 * 一次提交多个 "pre-split"脚本?