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)
を使用して、親の終了時にクリーンアップする
Pythonで接続を開始する方法を示すコードがいくつかあります。 –
@ TadhgMcDonald-Jensen私のコードを追加しました。私は問題が再試行部分によって引き起こされると思います。 –
これはバグではありません。何か問題が生じた場合には、クリーンアップするのはあなたの責任です。なぜあなたは子供のプロセスを殺すことができないのですか? – Phillip