我试图避免将变量冗余地传递到dataList
(例如,[(1, globalDict), (2, globalDict), (3, globalDict)]
),而是在全局使用它们。但是,在下面的代码中,global globalDict
不是这样做的解决方案。
是否有一种直接的方法来访问多处理函数中的数据?
我阅读了以下这里:
“通信是昂贵的。与线程之间的通信相比,在进程之间交换数据要昂贵得多。在中,数据在管道上传输之前被筛选成二进制格式。因此,当任务较小时,通信开销可能非常大。为了降低额外的成本,最好用块分配任务。”
我不确定这是否适用于这里,但无论如何,我想简化数据访问。
def MPfunction(data):
global globalDict
data += 1
# use globalDict
return data
if __name__ == '__main__':
pool = mp.Pool(mp.cpu_count())
try:
globalDict = {'data':1}
dataList = [0, 1, 2, 3]
data = pool.map(MPfunction, dataList, chunksize=10)
finally:
pool.close()
pool.join()
pool.terminate()
发布于 2017-05-03 02:31:25
在Linux上,multiprocessing
分叉一个新的进程副本来运行池工作人员。该进程具有父内存空间的副本写入视图。只要在创建池之前分配globalDict
,它就已经存在了。请注意,对该数据集的任何更改都将保留在子节点中。
在Windows上,创建了python的一个新实例,所需的状态在子程序中被腌制/解除了。在创建池并在其中复制时,可以使用初始化函数。这是每个子进程一个副本,比每个项目映射一次更好。
(顺便说一句,在创建池之后启动try
块,这样您就不会引用坏的池对象,如果这会引发错误)
import platform
def MPfunction(data):
global globalDict
data += 1
# use globalDict
return data
if platform.system() == "Windows":
def init_pool(the_dict):
global globalDict
globalDict = the_dict
if __name__ == '__main__':
globalDict = {'data':1}
if platform.system() == "Windows":
pool = mp.Pool(mp.cpu_count, init_pool(globalDict))
else:
pool = mp.Pool(mp.cpu_count())
try:
dataList = [0, 1, 2, 3]
data = pool.map(MPfunction, dataList, chunksize=10)
finally:
pool.close()
pool.join()
发布于 2022-08-24 18:20:56
如果要在进程之间共享的所有对象都是只读的,则可以在主线程(父进程)中将这些对象声明为全局变量,并将它们与子进程共享为参数。
from multiprocessing import Process
if __name__ == '__main__':
global number
number = 1000
p = Process(target=my_method, args=(number))
https://stackoverflow.com/questions/43749801
复制相似问题