Python 多处理和套接字。如何等待?
我有一个有4个节点的集群和一个主服务器。主机分派的作业可能需要30秒到15分钟才能结束 节点正在使用Python 多处理和套接字。如何等待?,python,sockets,multiprocessing,Python,Sockets,Multiprocessing,我有一个有4个节点的集群和一个主服务器。主机分派的作业可能需要30秒到15分钟才能结束 节点正在使用SocketServer.TCPServer进行侦听,在主节点中,我打开一个连接,等待作业结束 def run(nodes, args): pool = multiprocessing.Pool(len(nodes)) return pool.map(load_job, zip(nodes, args)) load\u job函数使用socket.sendall发送数据,然后立即
SocketServer.TCPServer进行侦听,在主节点中,我打开一个连接,等待作业结束
def run(nodes, args):
pool = multiprocessing.Pool(len(nodes))
return pool.map(load_job, zip(nodes, args))
load\u job
函数使用socket.sendall
发送数据,然后立即使用socket.recv
(数据需要很长时间才能到达)
程序运行良好,直到大约200或300个这些作业运行。当它中断时,socket.recv
接收到一个空字符串,在我终止节点进程并再次运行它们之前,无法再运行任何作业
我应该如何等待数据的到来?另外,池中的错误处理也非常糟糕,因为它保存了另一个进程中的错误,并在没有正确回溯的情况下显示,并且重复此错误并不常见
编辑:
现在我认为这个问题与套接字无关:
经过一些研究,看起来我的节点正在向许多进程开放(因为它们也在多处理.Pool
中运行它们的作业),但不知何故它们并没有被关闭
在后台进程中使用多处理时,我发现这些问题(和)是关于僵尸进程的(正是我的情况!)
我需要进一步了解这个问题,但目前我正在杀死节点并在一段时间后恢复它们。(我在编辑之前回答这个问题,因为我不完全理解您在其中的意思)
socket.recv
不是等待套接字上数据的最佳方式。我知道的最好的方法是使用select
模块(文档)。在单个套接字上等待数据时最简单的用法是select.select([your_socket],[])
,但它当然也可以用于更复杂的任务
关于socket的问题,recv
接收一个空字符串;当套接字是TCP套接字时(就像您的情况一样),这意味着该套接字已被对等方关闭。
原因可能各不相同,但需要了解的重要一点是,发生这种情况后,您将不再从该套接字接收任何数据,因此最好将其关闭(socket.close
)。如果您不希望它关闭,那么您应该在这里搜索问题
祝你好运 谢谢你的回答。“编辑”是导致套接字关闭的原因。。。某些节点中存在问题。