【问题标题】:Shared value in parallel python并行python中的共享值
【发布时间】:2010-05-05 01:58:44
【问题描述】:

我正在使用 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,但是通过共享该值,我可以更好地修剪我的 BFS 二叉树,并可能节省大量循环迭代。

谢谢-

乔纳森

【问题讨论】:

    标签: python parallel-processing


    【解决方案1】:

    实际上,http://www.parallelpython.com/content/view/17/31/#CALLBACK 有一个示例,他们只是使用线程模块中的锁。

    就像 JudoWill 指出的那样,请务必尝试在工作中同步全局最小值的频率。如果您每次都这样做,您最终可能会接近序列化整个计算。

    【讨论】:

      【解决方案2】:

      Parallel Python 在不同的进程上运行子函数,因此没有共享内存,这意味着您不应该使用共享值。 clackle 提到的回调示例将每个函数的结果合并到一个回调函数中,该回调函数在原始进程中运行。要正确使用它,您应该做类似的事情;在给出的示例中,您将计算局部最小值并使用回调函数来查找所有子结果的最小值。希望在您的真实案例中,您可以做类似的事情。

      【讨论】:

        【解决方案3】:

        我不确定 PP 模块,但您始终可以将最低值存储在暂存文件中。我唯一担心的是你会花费大部分时间来获取和释放锁。唯一的例外是您的 el &lt; min 操作很耗时。

        我实际上会说你的“合并”技术可能是要走的路。

        顺便说一句,我知道您为简洁起见给出了一个简单的代码示例,但不要使用min 作为变量名......它会在调试时让您非常头疼。

        【讨论】:

          【解决方案4】:

          您不会通过共享值来保存任何迭代,您需要从列表中读取每个元素至少一次。此外,它会更慢,因为您每次使用共享值时都需要锁定。

          在您的情况下,如果您想要更高的性能,您应该分别计算每个部分的最小值并在主线程中比较这些结果。

          另一方面,将列表传递给其他进程可能比一次性找到列表的最小值更消耗资源。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-07-19
            • 2015-12-25
            • 1970-01-01
            • 2012-06-17
            • 2015-10-13
            • 2022-10-15
            相关资源
            最近更新 更多