2016-12-01 12 views
0

何らかの条件で並列処理(ワーカー)を生成し、IOジョブを実行させるスクリプトを作成する必要があります。それが終わったら、そのプロセスを閉じます。 しかし、プロセスがデフォルトで終了する傾向がないように見えます。ここでいくつかの並列プロセスを起動し、終了後にそれらを終了させます

は私のアプローチです:

import multiprocessing 

pool = multiprocessing.Pool(4) 

def f(x):       
    sleep(10) 
    print(x) 
    return True 

r = pool.map_async(f, [1,2,3,4,5,6,7,8,9,10]) 

しかし、私はipythonでそれを実行し、この後、私はPSの補助を実行することができ、すべてのプリントのためwhait | grep ipythonと多くのプロセスを参照してください。これらの労働者がまだ生きているように見えます。

私は何か間違っているかもしれませんが、タスクを完了したらこれらのプロセスを終了させるにはどうすればよいですか?そして、私がたくさんの労働者を1つずつ産みたい場合(例えば、いくつかのrmqメッセージを得ることによって)、どのようなアプローチをとるべきですか?

+0

なぜプールしないのですか?それはあなたが使用しようとしているプロセスの数ではありませんか? – roganjosh

+0

はい、ありがとう!修正しました。変更はありません。 – Paul

答えて

1

プールは、プールの宣言時にワーカープロセスを起動します。彼らはプールが閉鎖されるまで殺されることはありません。代わりに、待ち行列にもっと多くの作業が表示されるよう待っています。

あなたがあなたのコードを変更した場合:

r = pool.map_async(f, [1,2,3,4,5,6,7,8,9,10]) 
pool.close() 
pool.join() 
print "check ps ax now" 
sleep (10) 

あなたはプロセスが消えているプールが表示されます。

プールを宣言した後に関数fを宣言すると、プログラムが意図したとおりに機能しない可能性があります。関数fの宣言に従うためにpool = multiprocessing.Pool(4)を変更しなければなりませんでしたが、これはPythonのバージョンによって異なる場合があります。とにかく、あなたが奇妙な "モジュールに属性がありません"という例外が出たら、これが理由です。

ハヌ

+0

はい、例外があるのでプール宣言を移動しました。ありがとう!このアプローチは、プロキシを非同期的に1つずつ生成することはできますか? – Paul

+0

プロセスはすでにpool = multiprocessing.Pool(4)で作成されています。それらを起動するためにmap_asyncやその他のジョブ投入コマンドは必要ありません。プールのアイデアは、あなたがそれらを供給することを決定したタスクを処理する準備ができているプロセスを準備し、プールを閉じて最後のタスクの処理が完了したときに終了するプロセスです。 map_asyncをデータのリストを処理するために使用する方法でmap_asyncを使用すると、完全に正常です。これはまさにそれが使用される方法です。 – Hannu

+0

ありがとう! :)私はここで別の質問をしました:http://stackoverflow.com/questions/40913207/return-value-from-spawned-multiprocessing-process興味があるかもしれません。 :) – Paul

関連する問題