以下代码对我来说似乎无法正常工作。它需要网络上的另一台计算机上启动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。我计划尽快迁移我的应用程序。标题编辑以反映解决方案。
@Thomas:我们是盲目的,没有关于作业和其他执行调试细节的附加信息。为什么不尝试pp中的一个例子,看看它们是否可以为你工作。这将是一个好的开始,然后采用简单的功能并使用您的代码来提交作业。看看它是否有任何区别。这样你可以缩小问题的范围。 – pyfunc 2010-11-05 00:34:36
@Thomas:示例链接:http://www.parallelpython.com/content/view/17/31/ – pyfunc 2010-11-05 00:36:43
应该被称为“令人费解的并行Python问题”。 – 2010-11-05 16:35:32