2015-04-23 32 views
0

有指定像這樣多重隊列負最大尺寸

import multiprocessing 
queue = multiprocessing.Queue(-1) 

爲一個multiprocessing.Queuemaxsize負數我找不到指定的文檔中的任何代碼的一些例子負值意味着什麼,所以我查看了multiprocessing.Queue源代碼。

class Queue(object): 

    def __init__(self, maxsize=0): 
     if maxsize <= 0: 
      maxsize = _multiprocessing.SemLock.SEM_VALUE_MAX 
     self._maxsize = maxsize 
     ... 

我似乎無法找到_multiprocessing.SemLock.SEM_VALUE_MAX值。負數是否會創建操作系統可能支持的最大隊列?是否有任何文件澄清這個魔術價值?

回答

3

multiprocessing.Queue的文檔顯然不直接說這個,但它強烈暗示在兩個地方。

首先,Queue文檔說:

Queue實現的queue.Queue除了task_done()join()所有方法。

及更早版本,在Exchanging objects between processes

Queue類是queue.Queue近克隆。

而且,如果你按照鏈接:

構造一個FIFO隊列。 maxsize是一個整數,用於設置可以放入隊列中的項目數量的上限。一旦達到此大小,插入將會阻塞,直到消耗隊列項目。如果maxsize小於或等於零,則隊列大小是無限的。

所以,是的,-1被記錄爲無限......雖然可能不是最直接的方式。

你可以在這裏提出一個文檔錯誤。也許所有的類都應該明確地聲明「界面完全像<relevant other class, with link>除了下面指定的」,而不是讓你在文檔的其他地方找到這些信息?


因爲你實際上問了兩個問題,不是一個,這裏的地方定義:

PyInit__multiprocessing,對於_multiprocessing模塊的頂級代碼,它是動態添加到SemLock類型的__dict__

它設置的值是特定於平臺的,但它通常是您的平臺的或INT_MAX。前者在POSIX 2004中定義爲limits.h的一部分,並且僅指定:

信號量可能具有的最大值。

來源評論可能有點混淆。

我不知道NetBSD的,但IIRC,老的FreeBSD也一樣:該值設置爲符號的整數(實際上,它只是一個#define預處理宏,但是這使得它的int -typed常數)但使用它的API採用無符號值。在C中,您只需將-1傳遞給一個函數,該函數的參數爲​​unsigned int,與傳遞UINT_MAX(4294967295)相同。 Python沒有這些轉換規則,所以模塊只會將-1轉換爲INT_MAX(2147483647),這樣更安全,而且你不會有超過21億個信號量。我相信目前的FreeBSD及其後代,如OS X,只是給你USHORT_MAX(32767),這使得這個不必要,但可能有其他操作系統也是如此。

+1

此外,'multiprocessing.Queue'文檔說:'Queue'實現'queue.Queue'除了'task_done()'和'join()'之外的所有方法。 –

+1

@EllaShar:我想這與「近克隆」一樣好。沒有人能夠直接保證語義,但它們都意味着它非常強烈。編輯答案;謝謝。 – abarnert

1

我似乎無法找到價值_multiprocessing.SemLock.SEM_VALUE_MAX

試試這個:

python -c "import _multiprocessing; import platform; print platform.platform(), _multiprocessing.SemLock.SEM_VALUE_MAX"

迄今發現的特定值(請編輯並相應地更新):

# OSX 10.9.5 
Darwin-13.4.0-x86_64-i386-64bit 32767 
# Linux Mint Qiana 
Linux-3.13.0-24-generic-x86_64-with-LinuxMint-17-qiana 2147483647 
# Fedora 
Linux-3.10.0-123.20.1.el7.x86_64-x86_64-with-fedora-21-Twenty_One 2147483647 
# Ubuntu Trusty 
Linux-3.13.0-45-generic-x86_64-with-Ubuntu-14.04-trusty 2147483647 
# Debian 8 
Linux-2.6.32.46-i686-with-debian-8.0 2147483647 

這可能是b對於文檔的改進suggest是一個很好的例子。如果你會如此善良。

文檔暗示

我找不到文檔中任何指定了一個負值意味着

它實際上平臺的依賴,用上面的命令得到實際值。

雖然似乎沒有要在特定maxsizemultiprocessing文檔,標準庫的Queue文檔有提供:

如果MAXSIZE小於或等於零時,隊列大小是無限的。

multiprocessing's guide指出

隊列類是Queue.Queue的近克隆。

因此,我想這是公平的假設,你的解釋是正確的,即創建由OS支持可能的最大的隊列。事實上,我們並沒有恢復到假設,這是一個事實:

底層細節

如果你想的_multiprocessing.SemLock.SEM_VALUE_MAX是如何在編譯時確定的血淋淋的細節,請繼續閱讀。

是否有任何文件闡明這個魔法值?

否 - 如果你真的想知道,你必須遵循的代碼...對於CPython的有這些#include文件multiprocessing.h和平臺的C庫的limits.h,後者最終被納入由Python.h。換句話說,根據主機平臺設置。

按Open Group的文檔上limits.h中它是被定義爲

旗語可具有的最大值。可接受的最小值:_POSIX_SEM_VALUE_MAX

所以_POSIX_SEM_VALUE_MAX是其又被定義爲最小

旗語可具有的最大值。 Value:32 767