令人费解的并行Python问题-传输\u套接字\u超时

令人费解的并行Python问题-传输\u套接字\u超时,python,parallel-processing,parallel-python,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):

以下代码对我来说似乎无法正常工作。它需要在网络上的另一台计算机上启动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/tomber/statusfile.txt,我可以看到它被写入了好几次,就好像这个函数被运行了好几次一样。我已经观察到这种情况持续了一个多小时,并且从未看到
job()
返回

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

好像是某种比赛条件?仅使用本地内核就可以了。这是第1.6.0版和第1.5.7版

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

一周后的更新:我已经编写了自己的并行处理模块来解决这个问题,并且在将来将避免使用并行python,除非有人弄明白这一点——我将在某个时候进一步研究它(实际上是深入研究源代码)


几个月后更新:没有剩余的怨恨,并行Python。我计划一有时间迁移我的应用程序就搬回去。标题编辑以反映解决方案。

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

来自并行Python论坛Bagira的答案:

每一次的计算需要多长时间 找工作?看看这个变量
TRANSPORT\u SOCKET\u超时
in /usr/local/lib/python2.6/dist-packages/pptransport.py

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


事实证明,这正是问题所在。在我的应用程序中,我使用PP作为作业的批处理调度器,这可能需要几分钟的时间,因此我需要对此进行调整。(默认值为30秒)

@Thomas:如果没有关于作业和其他执行调试详细信息的额外信息,我们是盲目的。为什么不试试pp中的一个例子,看看它们是否适合你。这将是一个很好的开始,然后使用简单的函数并使用您的代码提交作业。看看有没有什么不同。通过这种方式,您可以缩小问题的范围。@Thomas:examples:的链接应该被命名为“令人费解的并行Python问题”。我想知道,仅仅根据标题中的头韵,会得到多少视图:)@zourtney:我至少知道一个。嗯,我还没有观察到或阅读到并行Python的这种行为,但这是可能的。然而,在我的例子中,这些作业似乎在同一台计算机上重复执行——我想如果它没有正确返回,服务器发现一个客户端不忙,那么就可以重新分配作业。