并行Python中的共享值

5 投票
4 回答
1061 浏览
提问于 2025-04-15 22:21

我正在使用ParallelPython来开发一个对性能要求很高的脚本。我想在系统上运行的8个进程之间共享一个值。请原谅这个简单的例子,但它能说明我的问题。

def findMin(listOfElements):
    for el in listOfElements:
        if el < min:
             min = el

import pp
min = 0
myList = range(100000)
job_server = pp.Server()
f1 = job_server.submit(findMin, myList[0:25000])
f2 = job_server.submit(findMin, myList[25000:50000])
f3 = job_server.submit(findMin, myList[50000:75000]) 
f4 = job_server.submit(findMin, myList[75000:100000]) 

pp的文档似乎没有描述如何在进程之间共享数据。这可能吗?

如果可以的话,有没有一种标准的锁机制(就像线程模块中的那样),可以确保一次只有一个更新被执行?

l = Lock()
if(el < min):
     l.acquire
     if(el < min):
         min = el
     l.release

我明白我可以在主线程中保持一个本地的最小值,并在返回后进行比较,但通过共享这个值,我可以更好地修剪我的广度优先搜索二叉树,可能会节省很多循环迭代。

谢谢-

乔纳森

4 个回答

0

我不太确定PP模块的情况,但你可以把最低值存到一个临时文件里。我唯一担心的是,你可能会花很多时间在获取和释放锁上。唯一的例外是,如果你的el < min操作很耗时间的话。

其实我觉得你的“合并”方法可能是个不错的选择。

顺便说一下,我知道你为了简洁给出了代码的简单示例,但不要把min当作变量名……这会让你在调试时遇到很多麻烦。

1

并行Python会在不同的进程中运行子函数,这样就没有共享内存的概念,这意味着你不应该使用共享的值。clackle提到的回调示例是将每个函数的结果收集起来,然后在原来的进程中通过一个回调函数进行合并。要正确使用它,你应该做类似的事情;在给出的例子中,你会计算局部最小值,然后用一个回调函数来找出所有子结果中的最小值。希望在你的实际情况中也能做到类似的操作。

1

其实,在这个链接 http://www.parallelpython.com/content/view/17/31/#CALLBACK 上有个例子,他们简单地使用了线程模块中的锁。

正如JudoWill提到的,确保你在工作中尝试一下多频繁地同步全局最小值。如果每次都同步,可能会导致你的计算几乎变成串行的,也就是一个接一个地执行。

撰写回答