2017-08-31 6 views
1

マルチプロセッシングからサブクラスを作成します。マルチプロセッシングでstart()とrun()の属性を更新する方法

オブジェクトp.run()はlong_runtime_procからinstance.ret_valueを更新できますが、p_start()はlong_runtime_procが呼び出されて実行されてもret_valueを更新できません。

p.start()でret_valueを取得するにはどうすればよいですか?直接Process.run()を呼び出す

*class myProcess (multiprocessing.Process): 
    def __init__(self, pid, name, ret_value=0): 
     multiprocessing.Process.__init__(self) 
     self.id = pid 
     self.ret_value = ret_value 
    def run(self): 
     self.ret_value = long_runtime_proc (self.id)* 

答えて

0

新しいプロセスを開始しない、Process.run()にすなわちコードは、それを呼び出し同じプロセスで実行されます。そのため、self.ret_valueへの変更が有効です。ただし、Process.run()に直接電話することはできません。

新しい子プロセスが作成され、その後、Process.run()のコードは、この新しいプロセスでを実行するProcess.start()でサブプロセスを開始します。 long_runtime_procの戻り値をself.ret_valueに割り当てると、これは子プロセスで発生します。親ではないため、親のret_vauleは更新されません。

パイプまたはキューを使用して親プロセスに戻り値を送信する必要があります。詳細は、documentationを参照してください。ここでは、キューを使用した例です。

import time 
import multiprocessing 

def long_runtime_proc(): 
    '''Simulate a long running process''' 
    time.sleep(10) 
    return 1234 

class myProcess(multiprocessing.Process): 
    def __init__(self, result_queue): 
     self.result_queue = result_queue 
     super(myProcess, self).__init__() 

    def run(self): 
     self.result_queue.put(long_runtime_proc()) 

q = multiprocessing.Queue() 
p = myProcess(q) 
p.start() 
ret_value = q.get() 
p.join() 

このコードret_valueでrepyのための1234

+0

おかげだろうキューから値を割り当てられていることになります。 p.run()は、サブプロセスの代わりにメインプロセスでprocを実行するだけで、メインプロセスに値を返すことができます。そして、それは私が必要とする並行ではありません。 p.start()は実際には新しいプロセスを呼び出しますが、親プロセスに値を転送することはできません。 – xinwu

+0

@xinwu:正しい、それは私が言ったことです: 'p.run()'は同じプロセスで実行され、結果を得ることができます。 'p.start()'は、子プロセスで 'run()'メソッドを実行します。さらに私の答えを読んだら、解決策はキューや他の形式のプロセス間通信を使用することです。 – mhawke

+0

はい、キューまたはパイプを使用して、並列プロセスから戻り値を取得できます。あなたの返信をありがとう。 – xinwu

関連する問題