标签:sockets multiprocessing python
我有一个包含4个节点和一个主服务器的集群.主机分派可能需要30秒到15分钟才能结束的作业.
节点正在使用SocketServer.TCPServer进行侦听,在主服务器中,我打开一个连接并等待作业结束.
def run(nodes, args):
pool = multiprocessing.Pool(len(nodes))
return pool.map(load_job, zip(nodes, args))
load_job函数使用socket.sendall发送数据,然后立即使用socket.recv(数据需要很长时间才能到达).
该程序可以正常运行,直到运行这些作业中的约200或300.当它中断时,socket.recv会收到一个空字符串,无法运行任何作业,直到我杀死节点进程并再次运行它们.
我应该如何等待数据到来?此外,池中的错误处理非常差,因为它保存了另一个进程中的错误并在没有适当的回溯的情况下显示错误,并且这种错误很少重复出现…
编辑:
现在我认为这个问题与套接字无关:
经过一番研究,看来我的节点正在为许多进程打开路(因为它们也在多处理池中运行其工作),并且某种程度上它们并未关闭!
我发现这些SO问题(here和here)在守护进程中使用多处理时谈论的是僵尸进程(正是我的情况!).
我需要进一步了解该问题,但是现在我要杀死节点并在一段时间后恢复它们.
解决方法:
(我正在编辑之前回答这个问题,因为我不完全了解您在其中的意思).
socket.recv不是等待套接字上数据的最佳方法.我知道的最好方法是使用选择模块(文档here).在单个套接字上等待数据时,最简单的用法是select.select([your_socket],[],[]),但它当然也可以用于更复杂的任务.
关于socket.recv的问题,收到一个空字符串;当套接字是TCP套接字时(如您的情况),这意味着该套接字已被对等方关闭.
造成这种情况的原因可能有所不同,但是要了解的重要一点是,这种情况发生后,您将不再从此套接字接收任何数据,因此,最好的办法是关闭它(socket.close).如果您不希望它关闭,请在此处搜索问题.
祝好运!
标签:sockets,multiprocessing,python 来源: https://codeday.me/bug/20191127/2075240.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。