社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

Thomas • 4 年前 • 793 次点击  

下面的代码似乎对我不起作用。它需要在网络上的另一台计算机上启动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
 
793 次点击  
文章 [ 2 ]  |  最新文章 4 年前
Matt Williamson
Reply   •   1 楼
Matt Williamson    13 年前

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

Thomas
Reply   •   2 楼
Thomas    13 年前

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

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

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

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