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
は空の文字列を受け取り、ノードプロセスを強制終了して再度実行するまで、これ以上ジョブを実行できません。
データが来るのをどのように待つ必要がありますか?また、のエラー処理はpool
、別のプロセスからのエラーを保存し、適切なトレースバックなしで表示され、このエラーが繰り返されることはあまりないため、非常に貧弱です...
編集:今、私はこの問題はソケットとは何の関係もないと思います:
いくつかの調査の後、私のノードは多くのプロセスへの道を開いているように見えます(それらはでジョブを実行するためmultiprocessing.Pool
)そしてどういうわけかそれらは閉じられていません!
私はこれらのSOの質問(こことここ)がデーモン化されたプロセスで使用するときのゾンビプロセスについて話しているのを見つけましmultiprocessing
た(まさに私の場合です!)。
問題をさらに理解する必要がありますが、今のところ、ノードを強制終了し、しばらくしてから復元しています。