分享
三行代码  ›  专栏  ›  技术社区  ›  Thomas

令人费解的并行python问题-传输套接字超时 - Puzzling Parallel Python Problem - TRANSPORT_SOCKET_TIMEOUT

  •  2
  • Thomas  · 技术社区  · 3 月前

    下面的代码似乎对我不起作用。它需要在网络上的另一台计算机上启动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,除非有人发现了这一点——我将在某个时候考虑更多(实际上是深入到源代码中)。

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

    2 回复  |  直到 8 年前
        1
  •  2
  •   Thomas    8 年前

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

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

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

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

        2
  •  1
  •   Matt Williamson    8 年前

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