2014-07-24 37 views
6

我試圖從multiprocessing.Queue模塊使用一個隊列。 的實現(https://docs.python.org/3.4/library/multiprocessing.html#exchanging-objects-between-processes)使用ctx參數在multiprocessing.Queue

q = Queue() 

作爲實例化的例子。如果我嘗試,我得到了以下錯誤:

TypeError: __init__() missing 1 required keyword-only argument: 'ctx' 

谷歌搜索帶來了這樣的問題:

http://bugs.python.org/issue21367

我怎麼知道這是固定的嗎?現在不可能使用multiprocessing.Queues? 如果不是,我如何得到所需的ctx對象(以及它是什麼?)

+0

Python版本您使用的? – dano

+0

我正在使用3.4.1 – user3710165

+1

如何導入'Queue'? – dano

回答

5

聽起來好像你不直接從multiprocessing進口Queue。在引入上下文時,從頂層包導入的大多數對象都變成了內部獲取上下文的函數,然後將其傳遞給底層類初始化程序,而不是自己的類。例如,這裏是multiprocessing.Queue現在是:

def Queue(self, maxsize=0): 
    '''Returns a queue object''' 
    from .queues import Queue 
    return Queue(maxsize, ctx=self.get_context()) 

如果你要直接導入multiprocessing.queues.Queue和嘗試實例化它,你就會得到你所看到的錯誤。但如果直接從multiprocessing導入它,它應該可以正常工作。

上下文對象告訴multiprocessing正在使用哪個available methods for starting sub-processesmultiprocessing.Queue內部使用multiprocessing.Lock,必須知道正確的上下文才能正常工作。

0

這是應該如何多處理隊列類從Python的3.4繼承和:

from multiprocessing.queues import Queue 

class BlockedQueue(Queue): 
    def __init__(self, maxsize=-1, block=True, timeout=None): 
     self.block = block 
     self.timeout = timeout 
     super().__init__(maxsize, ctx=multiprocessing.get_context()) 
相關問題