0

python3を使用して並列にプロセスを実行したい。私が持っているコードは、もう一方のものを実行しています。どのようにそれを平行にするためのアイデア?python3でマルチプロセスが並行して動作しない

from multiprocessing import Process 

def work(x, outfile): 
    for i in range(0,200000): 
     print(x, i,'hello world', outfile) 

if __name__ == '__main__': 
    NUM_THREADS = 4 
    for x in range(NUM_THREADS): 
     try: 
      outfile = "tmp"+str(x) 
      p = Process(target=work, args =(x, outfile)) 
      p.start() 
      p.join() 
     except: 
      raise 
      print("Error: unable to start thread", x) 
+1

'p.joinを()'プロセスが終了するのを待ちます。あなたはそれをループから外したいと思っています。 – syntonym

+0

'print'の前に' raise'を置くことは決して 'print'を意味しません(re-' reise'は他の場所にキャッチするか、 '__main__'から完全に外に出るまで、後のコードをバイパスします)。 'print'が重要であれば、それらを入れ替えることができます。 – ShadowRanger

答えて

-1

デーモンとしてプロセスを実行する必要があります。プロセスが終了するのをp.daemon = Truep.start()

p.join()待機を追加

してみてください。あなたもそれを取り除く必要があります

+1

これは、[python documentation](https://docs.python.org/2/library/multiprocessing.html#multiprocessing.Process.daemon)を介してfalseです。 '[デーモンプロセス]はUnixデーモンやサービスではありません。 '[親プロセスが終了したときに]終了する通常のプロセスです。' – syntonym

+0

'p.daemon = True'を追加しようとしましたが、違いはありません。 'p.join()'を取り除くと、関数はさらに悪くなります。関数は部分的に1回だけ実行され、その後は中断して停止します。 – aLbAc

0

同じループの同じブロックで開始したり結合することはできません。参加「プロセス」は

if __name__ == '__main__': 
    NUM_THREADS = 4 
    process_list = [] 
    for x in range(NUM_THREADS): 
     try: 
      outfile = "tmp"+str(x) 
      p = Process(target=work, args =(x, outfile)) 
      p.start() 
      process_list.append(p) 
     except: 
      raise 
      print("Error: unable to start thread", x) 

    # wait for processes to finish 
    for process in process_list: 
     process.join() 
0

私はこれがあなたのために適切であるかどうかわからないんだけど、私は一般的にマルチモジュールに苦労し、代わりにとの大きな成功を収めたが完了し始めるまで、現在実行中のスレッドが停止しなければならないことを意味しますpathosモジュール(LinuxとMacでは少なくともWindowsではなく)。私はこれをマルチコア用に設定しましたが、threados/core splitの使用法についてはpathosモジュールをチェックしてください。このパッケージを記述するためのマイクMcKernsへ

クレジットは、それはPythonでマルチコアの使用のための非常に簡単に私の人生を作っ

必要な最小限のコードは、以下を参照してください:

from pathos.helpers import mp 
import numpy as np 

x=np.arange(0,200000) 
splitx=np.array_split(x,4) 
def dummy(y): 
    return(y) 

pooler=mp.Pool(4) 

for value in pooler.imap(dummy,splitx): 
    print(value) 

pooler.close() 
pooler.join() 

[ 0  1  2 ..., 49997 49998 49999] 
[50000 50001 50002 ..., 99997 99998 99999] 
[100000 100001 100002 ..., 149997 149998 149999] 
[150000 150001 150002 ..., 199997 199998 199999] 
+0

この「ヘルパー」モジュールには、既存の 'multiprocessing.Pool' APIに適合しないものはありません。ポイントは? – ShadowRanger

+0

Hm、私は正直なところここでは専門家ではありませんが、ディルモジュールを含めることで、マルチプロセスモジュールのオブジェクトタイプを酸洗する問題を克服します(心配するようなノービーは少なくなります)(https://stackoverflow.com/質問/ 19984152/what-c​​an-multiprocessing-and-dill-do-together) – srhoades10

関連する問題