2

以下代码似乎不适用于我。它需要在网络上的另一台计算机上启动 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()回报。

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

似乎是某种竞赛条件?只需使用本地内核就可以了。这是 pp v 1.6.0 和 1.5.7。

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

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

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

4

2 回答 2

2

来自 Parallel Python 论坛的 Bagira 的回答:

每个作业的计算需要多长时间?查看 /usr/local/lib/python2.6/dist-packages/pptransport.py 中的变量 TRANSPORT_SOCKET_TIMEOUT

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

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

于 2011-01-11T16:06:04.903 回答
1

可能是该库允许重复,因为某些节点落后,剩余任务会很长。通过复制任务,它可以绕过慢速节点,您应该只取最先完成的结果。您可以通过为每个任务包含一个唯一的 id 并只接受第一个为每个任务返回来解决这个问题。

于 2010-11-17T15:45:17.140 回答