繁体   English   中英

Python多处理,进程和池之间的差异,数据的剔除

[英]Python Multiprocessing, Difference between Process and Pool, Pickling of Data

我想知道启动一个工作池来并行管理一个任务或者在进行酸洗和分配工作时启动单个进程有什么区别。

我有一个任务(这里是do_my_job ),其对象无法被腌制。 因此,我无法启动一个工作池来并行执行任务。 以下代码段不起作用, 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)

在后一种情况下,我的工作如何分配给各个流程? 在进程启动之前,是否没有步骤来挑选任务和涉及的所有相关对象? 如果不是,任务和对象如何传递给新进程?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM