我试图避免将变量冗余地传递到dataList(例如[(1, globalDict), (2, globalDict), (3, globalDict)])中,而是全局使用它们。global globalDict不是在下面的代码中这样做的解决方案。
有没有一种简单的方法可以全局访问多处理函数中的数据?
我读到以下内容:
“沟通是昂贵的。
与线程之间的通信相比,进程之间的数据交换要昂贵得多。在Python中,数据在通过管道传输之前被pickle为二进制格式。因此,当任务很小时,通信开销可能非常大。为了降低额外成本,最好将任务分块分配。”
我不确定这是否适用于这里,但无论如何我想简化数据访问。

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()

最佳答案

在Linux上,multiprocessing派生进程的新副本以运行池工作进程。进程具有父内存空间的“写时复制”视图。只要在创建池之前分配globalDict,它就已经存在了。请注意,对该dict的任何更改都将保留在子项中。
在Windows上,创建了一个新的python实例,并在子对象中pickle/unpickle所需的状态。创建池并复制到那里时,可以使用初始化函数。这是每个子进程一个副本,比每个映射项一次要好。
(作为旁白,在创建池之后启动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()

09-18 18:42