使用多处理和池时如何访问全局变量?

Phi*_*lip 2 python global-variables multiprocessing

我试图避免必须将变量冗余地传递到dataList(例如[(1, globalDict), (2, globalDict), (3, globalDict)])并在全局中使用它们.global globalDict但是,在以下代码中不是这样做的解决方案.

是否有一种直接的方式来全局访问多处理功能中的数据?

我在这里阅读以下内容:

" 通信很昂贵. 与线程之间的通信相比,在进程之间交换数据要贵得多.在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()
Run Code Online (Sandbox Code Playgroud)

tde*_*ney 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()
Run Code Online (Sandbox Code Playgroud)