Py学习  »  Python

大共享数据的Python多处理

ammcom • 4 年前 • 679 次点击  

我正在使用python开发一个应用程序,使用 mutliprocessing 模块,代码如下所示:

import multiprocessing

globalData = loadData() #very large data 

def f(v):
    global globalData
    return someOperation(globalData,v)

if __name__ == '__main__':
    pool = multiprocessing.Pool()
    arr = loadArray() #some big list
    res = pool.map(f,arr)

问题是,所有子进程都需要相同的全局数据来处理该函数,因此它会加载该函数,并且需要很长时间。在所有子进程之间共享该数据的最佳解决方案是什么,因为它已经加载到父进程中了?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/50992
 
679 次点击  
文章 [ 2 ]  |  最新文章 4 年前
Meziane
Reply   •   1 楼
Meziane    5 年前

我也是python新手,但如果我真的理解了您的问题,那就很容易了:在下面的脚本中,我们使用5个工人来获得前10000个数字的平方。

import multiprocessing

globalData = range(10000) #very large data 

def f(x):
  return x*x

if __name__ == '__main__':
    pool = multiprocessing.Pool(5)
    print(pool.map(f,globalData))
Roland Smith
Reply   •   2 楼
Roland Smith    5 年前

ms-windows上的多处理与类UNIX系统的工作方式不同。

类UNIX系统具有 fork 系统调用,它生成当前进程的副本。在具有按写拷贝虚拟内存管理的现代系统中,这甚至不是一个非常昂贵的操作。

这意味着父进程中的全局数据将与子进程共享,直到子进程写入该页,在这种情况下,它将被复制。

问题是微软windows没有 . 它有 CreateProcess 相反。因此,在ms windows上,会发生以下情况:

父进程启动一个新的python解释器进程。子进程将只继承运行process objects run()方法所需的资源。特别是,父进程中不必要的文件描述符和句柄将不会被继承。与使用fork或forkserver相比,使用此方法启动进程相当慢。

因此,由于在函数中引用了全局数据,因此将加载该数据。 但是每个子进程都会分别加载它 .

您可以尝试的是让您的进程使用 mmap 具有 ACCESS_READ . 我会的 期待 ms-windows内存子系统足够聪明,在同一个文件被多个进程加载的情况下只加载一次数据。