以下代码似乎对我不正常。它需要在网络上的另一台计算机上启动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。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top