我正在努力避免将变量冗余地传递到dataList
(例如[(1, globalDict), (2, globalDict), (3, globalDict)]
)并在全局范围内使用它们。但是,global globalDict
不是在以下代码中执行此操作的解决方案。
是否有一种直接的方式来全局访问多处理功能中的数据?
我阅读了以下here:
“沟通费用昂贵。 与线程之间的通信相比,在进程之间交换数据要昂贵得多。在Python中,数据在传输管道之前被挑选成二进制格式。因此,当任务很小时,通信的开销可能非常大。为了减少无关的成本,最好在块中分配任务。“
我不确定这是否适用于此,但我想在任何情况下简化数据访问。
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()
答案 0 :(得分:7)
在Linux上,multiprocessing
分配进程的新副本以运行池工作程序。该进程具有父内存空间的写时复制视图。只要在创建池之前分配globalDict
,它就已存在。请注意,对该词典的任何更改都会留在孩子身上。
在Windows上,创建了一个新的python实例,并在子级中对所需状态进行pickle / unpickled。您可以在创建池并在那里复制时使用初始化函数。这是每个子进程一个副本,比每个项目映射好一次。
(另外,在创建池之后启动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()