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

2024-05-17

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

是否有一种直接的方法可以全局访问多处理函数中的数据?

我读了以下内容here http://tding.in/2016/10/23/python-multiprocessing.html:

"沟通是昂贵的。与线程之间的通信相比,进程之间交换数据的成本要高得多。在 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 实例,并在子进程中 pickled/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()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用Multiprocessing和Pool时如何访问全局变量? 的相关文章

随机推荐