2016-09-30 3 views
0

私はsubprocess32.Popenを使用しようとしていますが、これによりシステムがクラッシュする(CPU 100%)原因となります。だから、私は次のコードを持っている:この前サブプロセス32.Popenがクラッシュする(CPU 100%)

import subprocess32 as subprocess 

for i in some_iterable: 
    output = subprocess.Popen(['/path/to/sh/file/script.sh',i[0],i[1],i[2],i[3],i[4],i[5]],shell=False,stdin=None,stdout=None,stderr=None,close_fds=True) 

を、私は次のようでした:

import subprocess32 as subprocess 
for i in some_iterable: 
    output subprocess.check_output(['/path/to/sh/file/script.sh',i[0],i[1],i[2],i[3],i[4],i[5]]) 

...を、私はこれで問題はなかった - それは死ん遅かったことを除いて。

私はこれが速いことを知っていますが、CPUが数秒で100%も過ぎ、システムがクラッシュして強制的に再起動します。

ポポンをクラッシュさせているのは私がやっていることですか?

Linuxの場合、Python2.7であれば、まったく役に立ちます。

ありがとうございました。

+0

あなたのスクリプトは正確に何をしていますか?この場合、some_iterableはどれくらいの大きさですか? 'check_output()'は各プロセスが終了するのを待ちます。 'Popen()'はそうしないので、複数の並列プロセスが生成されます。そのため、スクリプトがメモリ不足のために多くのリソースを消費すると、システムが不安定になる可能性があります。 – mata

+0

'some_iterable'は約200万エントリです。私はあなたが言っていることを理解していますが、どうすればこの問題を避けることができますか? – JohnJ

答えて

0

問題は、2ミリオンプロセスを一度に開始しようとしているため、システムがブロックされています。

解決策は、一度に実行できるプロセスの最大数を制限し、各プロセスが終了するのを待つためにプールを使用することです。あなたがサブプロセスを開始し、それらを待っている。この例(バインドIO)、multiprocessing.dummyモジュールからのスレッドプールはどうなるのために:あなたが使用しているため

import multiprocessing.dummy as mp 
import subprocess32 as subprocess 

def run_script(args): 
    args = ['/path/to/sh/file/script.sh'] + args 
    process = subprocess.Popen(args, close_fds=True) 
    # wait for exit and return exit code 
    # or use check_output() instead of Popen() if you need to process the output. 
    return process.wait() 

# use a pool of 10 to allow at most 10 processes to be alive at a time 
threadpool = mp.Pool(10) 

# pool.imap or pool.imap_unordered should be used to avoid creating a list 
# of all 2M return values in memory 
results = threadpool.imap_unordered(run_script, some_iterable) 
for result in results: 
    ... # process result if needed 

私はPopenに引数のほとんどを残してきましたとにかくデフォルト値。あなたのスクリプトが大部分のIO(ネットワークアクセス、ファイルの書き込みなど)をしているならば、スクリプトが漫画的な仕事をしているならば、プールのサイズはおそらくあなたの利用可能なCPUコアの範囲内にあるはずです。

+0

'threadpool.imap_unordered(run_script、some_iterable)'の中で 'run_script'に引数を渡すにはどうしたらいいですか?第2に、CSVリーダーを使用して2百万のエントリを読み込み、「\t reader = csv.reader(open(filex)、delimiter = '|')のようなものを持っています \tリーダーの行: 'この場合、 'some_iterable'は? Previosuly、私はPopenのプロセスに各 '行'を渡した..あなたの考えでこれを今どのように達成できるかわからない.. – JohnJ

+0

私はこれをここで実装しようとしました:http://pastebin.com/jKka6cHGしかし、これはです間違っています... 'runscript'を使って' threadpool'を呼び出す方法がわかりません... – JohnJ

+0

'map'関数は、実行する関数と引数の繰り返し可能関数を取り、その関数をリストの各項目に対して呼び出します。だからあなたはループ内で関数を呼び出す必要はありません、あなたは[this](http://pastebin.com/WCRDCzfB)のように引数のイテレータとして 'reader'を渡すことができます。 – mata

関連する問題