2017-10-20 6 views
1

私は現在、multiprocessingモジュールを使用して、マルチスレッドの方法でいくつかのメソッドを実行するはずのクラスを作成しています。 nの労働者のPoolを使用して実際の計算を実行します。現在、nのアクティブワーカーのそれぞれに、0nの間のインデックスを他の計算に割り当てるようにしました。これを行うために、共有されたQueueを使用してインデックスを割り当てたいと思っていました。たびたび2人の従業員が同じIDを持たないようにしました。異なるスレッド間でクラス内で同じQueueを共有するには、Manager.Namespace()の内部に格納したかったのです。しかし、これを行うと、Queueにいくつかの問題があります。そのため、私は私の問題の最小バージョンを作成し、このようなものになってしまった:Manger.Namespace()内のマルチプロセッシングのキュー

from multiprocess import Process, Queue, Manager, Pool, cpu_count 

class A(object): 
    def __init__(self): 
     manager = Manager() 
     self.ns = manager.Namespace() 
     self.ns.q = manager.Queue() 

    def foo(self): 
     for i in range(10): 
      print(i) 
      self.ns.q.put(i) 
      print(self.ns.q.get()) 
      print(self.ns.q.qsize()) 

a = A() 
a.foo() 

このコードでは、実行は、第二のprint文の前に停止した - ので、私は何もデータが実際に書き込まれていないことを、考えてQueuenamespace関連のものを削除すると、コードは完璧に機能します。これはmultiprocessingオブジェクトの意図された動作ですか、何か間違っていますか?それとも何らかのバグですか?

答えて

2

はい、ここではNamespaceを使用しないでください。 Queueオブジェクトをmanager.Namespace()に入れると、各プロセスは新しいQueueインスタンスを取得します。これらの新しく作成されたキューオブジェクトのすべてのライター/リーダーは親プロセスとの接続を持たないため、ワーカープロセスはメッセージを受信しません。代わりにQueueを共有してください。

ところで、あなたは「スレッド」を何度も言いましたが、multiprocessモジュールのコンテキストでは、ワーカーはスレッドではなくプロセスです。

関連する問題