この質問は、コミュニティ管理のバックポートconcurrent.futures
を使用して、Python 2固有の質問です。並行未処理の処理プールにタスクをサブミットして送信します
私は2つのタスクを並列に実行するためにProcessPoolExecutorを使用しています(maxWorkersを2に設定)。これらのタスクはどちらもPythonの関数であり、私はそれらのそれぞれが独自のプロセスで動作するようにしたいと思います。彼らはお互いに調整する必要はありません(私は終了ステータスを知る必要はありません)。私はちょうど同時にプロセスを起動し、同時に実行されるプロセスの数を制限したいと考えています。
import concurrent.futures as futures
import time
def do_stuff(name):
for x in range(10):
print name, x
time.sleep(1)
pool = futures.ProcessPoolExecutor(max_workers=2)
pool.submit(do_stuff("a"))
print "a submitted!"
pool.submit(do_stuff("b"))
これは、しかし、プリント
a 0 a 1 ... a 9 a submitted! b 0 b 1 ... b 9
なぜsubmit
ブロッキング操作はありますか?ノンブロッキングの同等品はありますか?
ここでは、私が必要とする動作を持つmultiprocessing
ライブラリを使用した例を示します。ノンブロッキングで各プロセスを起動し、join
(おそらくwaitpid(2)
のまわりの薄いラッパー)を呼び出します。しかし、この手法では、ある瞬間に並行して実行されるプロセスの数を制限することはできません。あなたのコードから
import multiprocessing
import time
def do_stuff(name):
for x in range(10):
print name, x
time.sleep(1)
proc_a = multiprocessing.Process(target=do_stuff, args="a")
proc_b = multiprocessing.Process(target=do_stuff, args="b")
proc_a.start()
proc_b.start()
proc_a.join()
proc_b.join()
pool.submit(do_stuff( "a"))ここでdo_stuff( "a")のため実際にdo_stuffメソッドを実行しています。 – minhajul