2017-10-12 9 views
0

私はPythonマルチプロセッシングパイプを研究しています。私の目標は2つのプロセスが2つの独立したプロセスを作り、そのうちの1つが5つのメッセージを別のプロセスに送信することです。私はそれを実行しても問題はありませんが、PIDだけを表示するだけです。このコードをどうしたのですか?私の環境はWindows 10(64ビット)とPython 3.6.1(32ビット)です。私はこのコードがなぜ機能しないのかわかりません(マルチプロセッシング。パイプ)

import os 
import multiprocessing as mp 
import time 

global sending_end, receiving_end 
sending_end, receiving_end = mp.Pipe() 

def sender(sending_end=sending_end): 
    print('SND PID: ', os.getpid()) 
    for _ in range(5): 
     sending_end.send('test') 
     time.sleep(1) 


class receiver(mp.Process): 
    def __init__(self): 
     mp.Process.__init__(self) 

    def run(self, receiving_end=receiving_end): 
     print('REC PID: ', os.getpid()) 
     print(receiving_end.recv()) 
     time.sleep(1) 


if __name__ == '__main__': 

    print('MAIN PID: ', os.getpid()) 

    s = mp.Process(target = sender, args=(sending_end,)) 
    s.start() 

    r = receiver() 
    r.start()  

    mp.freeze_support() 
+0

なぜパイプを使うのか? [Queue](https://docs.python.org/3.3/library/multiprocessing.html?highlight=multiprocessing#exchanging-objects-between-processes)が用意されています。これはすべての処理を行います。 – uphill

+0

@uphill私は、プロセス間で双方向にメッセージを交換する可能性がある場合に備えて、パイプの使用がより互換性があると思います。 – maynull

+0

他のプロセスとしてPythonを使用していない場合は、[サブプロセス](https://docs.python.org/3/library/subprocess.html?highlight=subprocess#module-subprocess)を検討してください。これは、mutliprocessingがドロップであるためです複数のcpuを使用してGILを回避する代わりに、より多くのpythonプロセスを生成することによって置き換えられます。 – uphill

答えて

0

あなたがmultiprocessing.Processクラス(親)を継承receiverクラス(CHILD)のrun()メソッドを呼び出すことを忘れているようです。

run()が明示的に呼び出されていないため、run()親のメソッドが呼び出され、受信値の印刷コードがありません。したがって、コードが実行されていないと感じています。また

いくつかのより多くの事:

  • どちらのパイプを使用すると、ファイルを閉じるように最後にクローズする必要があります。
  • 子クラスrun()メソッドは送信プロセスが生き残るまで呼び出す必要があります。

上記の点をご確認の上、ご確認ください。

コード:

import os 
import multiprocessing as mp 
import time 

global sending_end, receiving_end 
sending_end, receiving_end = mp.Pipe() 


def sender(sending_end=sending_end): 
    print('SND PID: ', os.getpid()) 
    for i in range(5): 
     sending_end.send('test_' + str(i)) 
     time.sleep(1) 
    print "Done from sender" 
    #Closing sending pipe 
    sending_end.close() 


class receiver(mp.Process): 
    def __init__(self): 
     mp.Process.__init__(self) 

    def run(self, receiving_end=receiving_end): 
     print('REC PID: ', os.getpid()) 
     print("Dinesh - ",receiving_end.recv()) 
     time.sleep(1) 


if __name__ == '__main__': 
    import sys 
    print('MAIN PID: ', os.getpid()) 

    s = mp.Process(target = sender, args=(sending_end,)) 
    s.start() 

    r = receiver() 
    r.start() 

    while True: 
     #Checking sending process is alive or not 
     if not s.is_alive(): 
      print "Sending process is done. Exiting" 
      #Closing receiving end pipe 
      receiving_end.close() 
      #Closing receving process 
      r.terminate() 
      sys.exit() 
     time.sleep(0.1) 
     #Explicitly calling run method 
     r.run() 

    mp.freeze_support() 

出力:

('MAIN PID: ', 16400) 
('REC PID: ', 16400) 
('REC PID: ', 12544) 
('SND PID: ', 17744) 
('Dinesh - ', 'test_0') 
('REC PID: ', 16400) 
('Dinesh - ', 'test_1') 
('REC PID: ', 16400) 
('Dinesh - ', 'test_2') 
('REC PID: ', 16400) 
('Dinesh - ', 'test_3') 
('REC PID: ', 16400) 
('Dinesh - ', 'test_4') 
Done from sender 
Sending process is done. Exiting 
関連する問題