并行Python中的共享值
我正在使用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提到的,确保你在工作中尝试一下多频繁地同步全局最小值。如果每次都同步,可能会导致你的计算几乎变成串行的,也就是一个接一个地执行。