繁体   English   中英

使用 Multiprocessing 和 Pool 时如何访问全局变量?

[英]How can global variables be accessed when using Multiprocessing and Pool?

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

是否有一种直接的方法可以在全球范围内访问多处理 function 中的数据?

我在这里阅读了以下内容:

通信是昂贵的。与线程之间的通信相比,进程之间交换数据的成本要高得多。在 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()

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

如果您要在进程之间共享的所有对象都是只读的,您可以在主线程(父进程)中将它们声明为全局变量,并以 arguments 与子进程共享它们。

from multiprocessing import Process

if __name__ == '__main__':
    global number
    number = 1000
    p = Process(target=my_method, args=(number))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM