2017-10-20 105 views
1

我目前創建這是應該在一個多線程的方式執行一些方法中,使用multiprocessing模塊的類。我使用n工作人員的Pool執行實際計算。現在,我想每個當前n活躍職工的分配0n之間的索引其他一些計算。爲此,我希望使用共享的Queue以某種方式分配索引,即每次都沒有兩個工作人員具有相同的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() 

在這段代碼,執行第二打印語句之前停止 - 因此,我認爲,沒有數據實際寫入Queue。當我刪除namespace相關的東西時,代碼完美無瑕。這是multiprocessing的對象的預期行爲,我做錯了什麼?或者這是一種錯誤?

回答

2

是的,你不應該在這裏使用Namespace。當你把一個Queue對象爲manager.Namespace(),每個進程將獲得一個新Queue例如,所有這些新創建的隊列對象的寫入/讀取器與父進程沒有任何聯繫,因此沒有消息會由工作進程接收。改爲僅共享Queue

順便說一下,你提到的「線程」很多次,但在multiprocess模塊的情況下,工人是一個過程,而不是一個線程。