直從Python docs:Python的多處理隊列可靠性,隊列VS SimpleQueue VS JoinableQueue
類multiprocessing.Queue([MAXSIZE])
...
QSIZE() 返回隊列的近似大小。由於多線程/多處理語義,這個數字是不可靠的。
empty() 如果隊列爲空則返回True,否則返回False。由於多線程/多處理語義,這是不可靠的。
而且我憑經驗發現這對於Queue
尤其如此,empty()
。
在我的代碼我有一堆的進程(每個相同的主進程的子),並且每個具有在其run
方法如下:
while self.active:
if(self.exclusive_queue.empty() and self.exclusive_queue.qsize() == 0):
try:
self.exclusive_queue.put(self.general_queue.get(timeout=self.queue_timeout))
except Queue.Empty as empty_queue:
continue
else:
task = self.exclusive_queue.get()
self.compute(task)
基本上,處理等待在general_queue
工作,但首先檢查它的exclusive_queue
。主進程可以將任務放入進程的常規隊列或排隊隊列中。現在,在if(self.exclusive_queue.empty() and self.exclusive_queue.qsize() == 0)
中,我首先使用了一個self.exclusive_queue.empty()
,這導致了相當奇怪的行爲(qsize()
爲30+和empty() = True
)。
那麼,我這個標題是 - 在文檔爲multiprocessing.queues.SimpleQueue
寫到:
空() 返回真,如果隊列爲空,否則爲false。
根本沒有提到可靠性。 SimpleQueue.empty()是可靠的嗎?
第二個是multiprocessing.JoinableQueue
由於task_done()
機制的可靠或「更」可靠比Queue
?
這樣的方法可以被認爲是正確的,或者可能是回調方法(通過兒童之間的共享管道端點)更合適嗎?
是的,我幾乎在我的服務器中使用相同的方法。如果'compute'得到'None',它會將'active'變爲'False'。但是,正如你在我的案例中所看到的,我有兩個隊列需要等待 - 「獨佔」和「普通」隊列的想法是「如果排他是空的,從一般來說」,但是,因爲我希望能夠停止即使在通用隊列中有條目,我也會處理這些'None'。 – dmg