【问题标题】:multiprocessing and sockets. How to wait?多处理和套接字。怎么等?
【发布时间】: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 问题(herehere)在谈论在守护进程中使用 multiprocessing 时的僵尸进程(正是我的情况!)。

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

【问题讨论】:

    标签: python sockets multiprocessing


    【解决方案1】:

    (我在编辑之前回答了这个问题,因为我不明白你的意思)。

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

    关于socket.recv接收空字符串的问题;当套接字是 TCP 套接字(在您的情况下)时,这意味着套接字已被对等方关闭。 造成这种情况的原因可能会有所不同,但要了解的重要一点是,发生这种情况后,您将不再从该套接字接收任何数据,因此您能做的最好的事情就是关闭它(@ 987654326@)。如果您不希望它关闭,那么您应该在此处搜索问题。

    祝你好运!

    【讨论】:

    • 感谢您的回答。 “编辑”是导致套接字关闭的原因......某些节点出现问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 2017-04-19
    • 2013-07-03
    相关资源
    最近更新 更多