【发布时间】:2012-10-01 03:03:57
【问题描述】:
我有一个包含 4 个节点和一个主服务器的集群。 master 分派的作业可能需要 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 会收到一个空字符串,并且在我终止节点进程并再次运行它们之前无法运行更多作业。
我应该如何等待数据到来?另外,pool 中的错误处理非常糟糕,因为它保存了来自另一个进程的错误并且在没有正确回溯的情况下显示,而这个错误不是如此常见的重复......
编辑: 现在我认为这个问题与套接字无关:
经过一些研究,看起来我的节点正在向许多进程开放(因为它们也在 multiprocessing.Pool 中运行它们的工作)并且不知何故它们没有被关闭!
我发现这些 SO 问题(here 和 here)在谈论在守护进程中使用 multiprocessing 时的僵尸进程(正是我的情况!)。
我需要进一步了解这个问题,但现在我正在杀死节点并在一段时间后恢复它们。
【问题讨论】:
标签: python sockets multiprocessing