令人困惑的平行python问题-Transport_socket_timeout
-
29-09-2019 - |
题
以下代码似乎对我不正常。它需要在网络上的另一台计算机上启动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()
返回。
ODDER:如果我将TestFunc定义中的迭代次数更改为10 ** 8,则该函数仅运行一次,并按预期返回结果!
似乎是某种种族条件?仅使用本地核心工作正常。这是PP V 1.6.0和1.5.7。
更新:大约775,000,000:我得到不一致的结果:首次完成两次作业一次。
一周后更新:我已经写了自己的并行处理模块来解决这个问题,并且将来会避免并行python,除非有人弄清楚这一点 - 我会进一步查看它(实际上是潜入来源代码)在某个时候。
几个月后的更新:没有剩下的困难,平行的python。我计划一旦有时间迁移我的申请。标题编辑以反映解决方案。
解决方案
平行Python论坛的Bagira的答案:
每项工作的计算需要多长时间?看看变量
TRANSPORT_SOCKET_TIMEOUT
在/usr/local/lib/python2.6/dist-packages/pptransport.py中。也许您的工作比上面变量中的时间更长。增加其价值并尝试。
原来这正是问题所在。在我的应用程序中,我将PP用作可能需要几分钟的作业的批处理调度程序,因此我需要对此进行调整。 (默认为30秒)
其他提示
可能是库允许重复的,因为后面的一些节点滞后将有很长的剩余任务要完成。通过复制任务,它可以绕过慢节点,您应该首先完成结果。您可以通过在每个任务中包含一个唯一的ID来解决此问题,并仅接受第一个返回每个任务的ID。