2010-11-04 44 views
2

以下代码对我来说似乎无法正常工作。它需要网络上的另一台计算机上启动ppserver,例如用下面的命令:令人费解的并行Python问题 - TRANSPORT_SOCKET_TIMEOUT

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()的回报。

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

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

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

本周后更新:我编写了自己的并行处理模块来解决这个问题,并且将来会避免并行python,除非有人知道 - 我会绕过去看看它(实际上潜入源代码中)。

几个月后更新:没有剩余的硬感,并行Python。我计划尽快迁移我的应用程序。标题编辑以反映解决方案。

+0

@Thomas:我们是盲目的,没有关于作业和其他执行调试细节的附加信息。为什么不尝试pp中的一个例子,看看它们是否可以为你工作。这将是一个好的开始,然后采用简单的功能并使用您的代码来提交作业。看看它是否有任何区别。这样你可以缩小问题的范围。 – pyfunc 2010-11-05 00:34:36

+0

@Thomas:示例链接:http://www.parallelpython.com/content/view/17/31/ – pyfunc 2010-11-05 00:36:43

+3

应该被称为“令人费解的并行Python问题”。 – 2010-11-05 16:35:32

回答

2

回答Bagira并行的Python论坛:

多久每 作业的计算时间?看看变量 TRANSPORT_SOCKET_TIMEOUT /usr/local/lib/python2.6/dist-packages/pptransport.py。

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

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

1

这可能是因为某些节点落后,该库允许重复,因此将会有剩余任务的长尾完成。通过复制任务,它可以绕过慢速节点,并且只需要首先完成的结果。您可以通过为每个任务添加一个唯一的ID来解决此问题,并且只接受每个任务返回的第一个ID。

+0

嗯,我没有观察到或读过关于这种行为的平行python的一部分,但这是一种可能性。然而就我而言,这些工作似乎是在同一台计算机上反复执行 - 我猜如果它没有正确返回,那么服务器发现客户端不忙,因此再次分配了该工作。 – Thomas 2010-11-18 03:01:41