python-多处理和套接字.如何等待?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python-多处理和套接字.如何等待?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1495字,纯文字阅读大概需要3分钟。
内容图文
![python-多处理和套接字.如何等待?](/upload/InfoBanner/zyjiaocheng/657/c3ad47614cf64431be57358507b44f20.jpg)
我有一个包含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],[],[]),但它当然也可以用于更复杂的任务.
关于so??cket.recv的问题,收到一个空字符串;当套接字是TCP套接字时(如您的情况),这意味着该套接字已被对等方关闭.
造成这种情况的原因可能有所不同,但是要了解的重要一点是,这种情况发生后,您将不再从此套接字接收任何数据,因此,最好的办法是关闭它(socket.close).如果您不希望它关闭,请在此处搜索问题.
祝好运!
内容总结
以上是互联网集市为您收集整理的python-多处理和套接字.如何等待?全部内容,希望文章能够帮你解决python-多处理和套接字.如何等待?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。