gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 15:16:15 24 4
gpt4 key购买 nike

我想知道启动工作池以并行管理任务或启动单个进程在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com