令人困惑的并行Python问题 - TRANSPORT_SOCKET_TIMEOUT

时间:2010-11-04 23:36:38

标签: python parallel-processing parallel-python

以下代码似乎对我不起作用。它需要在网络上的另一台计算机上启动ppserver,例如使用以下命令:

ppserver.py -r -a -w 4

启动此服务器后,在我的计算机上运行此代码:

import pp
import time
job_server = pp.Server(ppservers = ("*",))
job_server.set_ncpus(0)
def addOneBillion(x):
    r = x
    for i in xrange(10**9):
        r+=1
    f = open('/home/tomb/statusfile.txt', 'a')
    f.write('finished at '+time.asctime()+' for job with input '+str(x)+'\n')
    return r

jobs = []
jobs.append(job_server.submit(addOneBillion, (1,), (), ("time",)))
jobs.append(job_server.submit(addOneBillion, (2,), (), ("time",)))
jobs.append(job_server.submit(addOneBillion, (3,), (), ("time",)))

for job in jobs:
    print job()
print 'done'

奇怪的部分: 看着/home/tomb/statusfile.txt,我可以看到它被多次写入,好像该函数正在运行多次。我观察到这种情况持续了一个多小时,从未见过job()回归。

奥德: 如果我将testfunc定义中的迭代次数更改为10 ** 8,则该函数只运行一次,并按预期返回结果!

看起来像某种竞争条件?只使用本地核心工作正常。这是pp v 1.6.0和1.5.7。

更新:大约775,000,000:我的结果不一致:两个工作重复一次,第一次完成。

一周后更新:我已经编写了自己的并行处理模块来解决这个问题,并且将来会避免使用并行python,除非有人想出来 - 我会再去看看它(实际潜水)在某些时候进入源代码。

几个月后更新:没有遗留下来的感觉,并行Python。我计划在有时间迁移我的应用程序后立即返回。标题编辑以反映解决方案。

2 个答案:

答案 0 :(得分:2)

并行Python论坛的Bagira回答:

  

每次计算多长时间   工作?看看变量   TRANSPORT_SOCKET_TIMEOUT in   /usr/local/lib/python2.6/dist-packages/pptransport.py。

     

也许你的工作需要的时间比   在上面的变量中的时间。增加   它的价值并尝试。

原来这就是问题所在。在我的应用程序中,我使用PP作为可能需要几分钟的作业的批处理调度程序,所以我需要调整它。 (默认值为30秒)

答案 1 :(得分:1)

可能是库允许重复,因为一些节点落后,将有一长串剩余的任务要完成。通过复制任务,它可以绕过慢节点,你应该先取结果。您可以通过为每个任务包含唯一ID来解决这个问题,并且只接受每个任务返回的第一个ID。