Python 多处理,进程和池的区别,数据的 pickle

标签 python multiprocessing pickle

我想知道启动工作池以并行管理任务或启动单个进程在 pickle 和分配作业方​​面有什么区别。

我有一个任务(这里是 do_my_job),它的对象不能被 pickle。因此,我无法启动一个工作池来并行执行任务。以下代码段不起作用,其中 iterator 迭代 do_my_job 的不同参数设置:

import multiprocessing as multip

mpool = multip.Pool(ncores)
mpool.map(do_my_job, iterator)
mpool.close()
mpool.join()

然而,以下代码片段确实有效:

import time
import multiprocessing as multip

keep_running=True
process_list = []

while len(process_list)>0 or keep_running:

    terminated_procs = []
    for idx, proc in enumerate(process_list):

        if not proc.is_alive():
            terminated_procs.append(idx)

    for terminated_proc in terminated_procs:
        process_list.pop(terminated_proc)

    if len(process_list) < ncores and keep_running:
        try:
            task = iterator.next()
            proc = multip.Process(target=do_my_job,
                                                   args=(task,))

            proc.start()
            process_list.append(proc)
        except StopIteration:
            keep_running=False


    time.sleep(0.1)

在后一种情况下,我的工作是如何分配给各个流程的?在流程开始之前,是否没有 pickle 任务和所有相关对象的步骤?如果不是,任务和对象如何传递给新流程?

最佳答案

当您fork 一个新进程时,子进程将继承其父进程的数据。因此,如果父级在 fork 之前定义了一个变量,则子级将能够看到它,就像它是自己的变量一样。在 fork 系统调用之后,子进程和父进程应该使用一些 IPC 在它们之间共享数据。 当您创建一个 Pool 时,您将 fork N 个进程,然后,当您调用 map 时,您将数据传递给它们。但是,因为进程已经 fork 了,所以共享此数据的唯一方法是使用涉及“pickling”对象的 IPC。在后一种情况下,您在创建数据后 进行 fork ,因此子进程能够像访问它自己的地方一样访问它。 我认为您能做的最好的事情就是让您的对象“可拾取”。

关于Python 多处理,进程和池的区别,数据的 pickle ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20702455/

相关文章:

Python-rq with flask + uwsgi + Nginx : Do I need more uwsgi processes or redis workers?

python - 如何在 python 中保存大 "database-like"类

python - 为什么 python 中的 shelve 模块有时会创建具有不同扩展名的文件?

Python - 多进程,类的成员函数

python - 如何(安全)将 Python 对象发送到我的 Flask API?

python - 使用 boolean 值列表进行埃拉托色尼筛选

python - 如何在 Pandas 数据框中拆分文档并为每个句子创建行

python - 运行时错误 : Error(s) in loading state_dict for Generator: Missing key(s) in state_dict

python - 如何在另一个进程中运行一些 python 代码?

python - Python中多重处理后的后处理结果