Py学习  »  Python

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

Thomas • 6 年前 • 1767 次点击  

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

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

似乎是某种种族状况?只使用本地核心就可以了。这是第1.6.0和1.5.7版。

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

一周后更新:我已经编写了自己的并行处理模块来解决这个问题,并且在将来将避免使用并行的Python,除非有人发现了这一点——我将在某个时候考虑更多(实际上是深入到源代码中)。

几个月后更新:没有剩下的苦涩感觉,平行巨蟒。我计划在有时间迁移我的应用程序后立即返回。标题编辑以反映解决方案。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/32911
文章 [ 2 ]  |  最新文章 6 年前
Matt Williamson
Reply   •   1 楼
Matt Williamson    14 年前

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

Thomas
Reply   •   2 楼
Thomas    14 年前

来自并行python论坛的bagira的回答:

每隔多长时间计算一次 工作需要吗?看看这个变量 TRANSPORT_SOCKET_TIMEOUT 在里面 /usr/local/lib/python2.6/dist-packages/pptransport.py。

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

结果发现这正是问题所在。在我的应用程序中,我使用pp作为作业的批处理调度程序,这可能需要几分钟的时间,所以我需要调整它。(默认为30秒)