Python 多处理和套接字。如何等待?

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发送数据,然后立即

我有一个有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
发送数据,然后立即使用
socket.recv
(数据需要很长时间才能到达)

程序运行良好,直到大约200或300个这些作业运行。当它中断时,
socket.recv
接收到一个空字符串,在我终止节点进程并再次运行它们之前,无法再运行任何作业

我应该如何等待数据的到来?另外,
池中的错误处理也非常糟糕,因为它保存了另一个进程中的错误,并在没有正确回溯的情况下显示,并且重复此错误并不常见


编辑: 现在我认为这个问题与套接字无关:

经过一些研究,看起来我的节点正在向许多进程开放(因为它们也在
多处理.Pool
中运行它们的作业),但不知何故它们并没有被关闭

在后台进程中使用
多处理时,我发现这些问题(和)是关于僵尸进程的(正是我的情况!)

我需要进一步了解这个问题,但目前我正在杀死节点并在一段时间后恢复它们。

(我在编辑之前回答这个问题,因为我不完全理解您在其中的意思)

socket.recv
不是等待套接字上数据的最佳方式。我知道的最好的方法是使用
select
模块(文档)。在单个套接字上等待数据时最简单的用法是
select.select([your_socket],[])
,但它当然也可以用于更复杂的任务

关于
socket的问题,recv
接收一个空字符串;当套接字是TCP套接字时(就像您的情况一样),这意味着该套接字已被对等方关闭。 原因可能各不相同,但需要了解的重要一点是,发生这种情况后,您将不再从该套接字接收任何数据,因此最好将其关闭(
socket.close
)。如果您不希望它关闭,那么您应该在这里搜索问题

祝你好运

谢谢你的回答。“编辑”是导致套接字关闭的原因。。。某些节点中存在问题。