2017-06-02 4 views
0

複数のプロセスにデータを送信したい。すべてのプロセスがそのデータで何か他のことを行い、次のデータを待つ。Python 2の複数のプロセスにデータを送信

worker 1 : 1 

worker 2 : 1 

worker 1 : 2 

worker 2 : 2 

:私はこのような何かを期待し

worker 2 : 1 

worker 1 : 2 

from multiprocessing import Process, Manager 

def do_work1(in_queue): 
    while True: 
     item = in_queue.get() 
     # exit signal 
     if item == None: 
      return 
     print "worker 1 : {}".format(item) 

def do_work2(in_queue): 
    while True: 
     item = in_queue.get() 
     # exit signal 
     if item == None: 
      return 
     print "worker 2: {}".format(item) 



if __name__ == "__main__": 
    num_workers = 2 

    manager = Manager() 

    work = manager.Queue(num_workers) 

    # start for workers 
    pool = [] 
    p = Process(target=do_work1, args=(work,)) 
    p.start() 
    pool.append(p) 
    p2 = Process(target=do_work2, args=(work,)) 
    p2.start() 
    pool.append(p2) 



    work.put("1") 
    work.put("2") 

    for p in pool: 
     p.join() 

しかし、実行後の私が手にこのコード:

worker 1 : 1 

worker 1 : 2 

または私はこのようなものを持っています私が取得したい場合、私は何を変えるべきですか?上記の結果は?

答えて

0

あなたはすべてのプロセスにデータを送信するためにマルチプロセッシングパイプを使用することができます。データを想定し

https://docs.python.org/2/library/multiprocessing.html#multiprocessing.Pipe

を漬けことができます:

https://docs.python.org/2/library/pickle.html#what-can-be-pickled-and-unpickled

あなたが持っていることができるだろうプロセスはパイプの最後のデータを待ち、データを送信するときにすべてのパイプのリストをループします。

+0

を使用して、手動キュー処理を排除することができますが、それはデフォルトのライブラリではありませんので、それはマニュアルに表示されないことがあり – John

+0

を漬けことができませんPythonで。しかし、それはピックアップすることができます。 – njoosse

+0

これはndarrayで動作します。どうもありがとう – John

0

あなたはうーん、numpy.ndarrayは思わmultiprocessing.Pool

import multiprocessing 


def do_work1(item): 
    print "worker 1: {}".format(item) 


def do_work2(item): 
    print "worker 2: {}".format(item) 


if __name__ == '__main__': 
    pool = multiprocessing.Pool(2) 

    pool.apply_async(do_work1, (1,)) 
    pool.apply_async(do_work2, (1,)) 
    pool.apply_async(do_work1, (2,)) 
    pool.apply_async(do_work2, (2,)) 

    pool.close() 
    pool.join() 
関連する問題