2016-04-10 15 views
1

Python(3.5)では、Xshell接続からmultiprocessing.Pool.map + subprocessによって外部実行可能ファイル(C++で書かれています)を実行し始めました。ただし、Xshell接続はインターネットの状態が悪いため中断されます。マルチプロセスPythonが終了したときに外部プログラムが実行中

再び接続した後、私は消えていますが、C++実行可能ファイルがまだ実行されている管理パイソンことがわかり(と、それは正しい方法でのように見える、プールはまだそれらを制御するようです。)

この場合の質問ですバグであり、私はこの場合に何をしなければなりません。私はkillまたはkill -9できません。

:すべてsublst_fileを手動で削除した後、すべての実行ファイル(cmd)はなくなりました。 except sub.SubprocessError as e:の部分がまだ動作しているようです。

私のプログラムの基本的な枠組みについて以下に概説します。

import subprocess as sub 
import multiprocessing as mp 
import itertools as it 
import os 
import time 

def chunks(lst, chunksize=5): 
    return it.zip_longest(*[iter(lst)]*chunksize) 

class Work(): 
    def __init__(self, lst): 
     self.lst = lst 

    def _work(self, sublst): 
     retry_times = 6 
     for i in range(retry_times): 
      try: 
       cmd = 'my external c++ cmd' 
       sublst_file = 'a config file generated from sublst' 
       sub.check_call([cmd, sublst_file]) 
       os.remove(sublst_file) 
       return sublst # return success sublst 
      except sub.SubprocessError as e: 
       if i == (retry_times-1): 
        print('\n[ERROR] %s %s failed after %d tries\n' % (cmd, sublst_file, retry_times)) 
        return [] 
       else: 
        print('\n[WARNNING] %dth sleeping, please waiting for restart\n' % (i+1)) 
        time.sleep(1+i) 

    def work(self): 
     with mp.Pool(4) as pool: 
      results = pool.map(self._work, chunks(self.lst, 5)) 
     for r in it.chain(results): 
      # other work on success items 
      print(r) 
+0

を使用して、親の終了時にクリーンアップする

Pythonで接続を開始する方法を示すコードがいくつかあります。 –

+0

@ TadhgMcDonald-Jensen私のコードを追加しました。私は問題が再試行部分によって引き起こされると思います。 –

+1

これはバグではありません。何か問題が生じた場合には、クリーンアップするのはあなたの責任です。なぜあなたは子供のプロセスを殺すことができないのですか? – Phillip

答えて

2

multiprocessing.Pool順番に(出口)モジュールアンロード時に呼び出されるも__del__によって呼び出されterminate()時にその労働者を終了しません。

これらの人が孤立している理由は、終了時にsubprocess.check_callのスポーンが終了しないためです。

この事実は、参考文献では明示的には言及されていませんが、スポーンが終了する場所は何も示されていません。 source codeの簡単なレビューも私には何の発見もなかった。この動作も簡単にテストできます。それはあまりにも漠然とではありませんが、私は完全にあなたが実際に何をしているかを把握することを数回読むのに必要な、追加することが役に立つかもしれませんPopenインタフェースと、この答えKilling child process when parent crashes in python

+0

マニュアルページにそのことを指摘できますか? –

+0

@JonathanLeffler 'multiprocess'に関する部分は十分に文書化されていますので、' subprocess'についての第2の部分を意味すると思います。それは明示的には言われていませんが、リファレンス文書のどこにでもスポーンが終了していることは示されていません。ソースコードを簡単に見直しても、私には何の発見もなかった。 – szym

関連する問題