多处理队列负最大值

时间:2015-04-23 21:03:31

标签: python message-queue python-multiprocessing

有一些代码示例指定maxsize的{​​{1}}的负数,如此

multiprocessing.Queue

我在文档中找不到任何指定负值意味着什么的内容,所以我查看了import multiprocessing queue = multiprocessing.Queue(-1) 源代码。

multiprocessing.Queue

我似乎无法找到class Queue(object): def __init__(self, maxsize=0): if maxsize <= 0: maxsize = _multiprocessing.SemLock.SEM_VALUE_MAX self._maxsize = maxsize ... 的值。负数是否会创建OS支持的最大队列?是否有任何文件可以澄清这种神奇的价值?

2 个答案:

答案 0 :(得分: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&gt;完全相同,除非下面指定”,而不是让您在文档的其他地方找到该信息?

由于您实际上问了两个问题,而不是一个问题,这里定义了SEM_VALUE_MAX

PyInit__multiprocessing _multiprocessing模块的顶级代码中,它会动态添加到__dict__类型的SemLock

它设置的值是特定于平台的,但它通常是您的平台的SEM_VALUE_MAXINT_MAX。前者在POSIX 2004中定义为limits.h的一部分,并且只指定:

  

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

源评论可能有点令人困惑。

我不知道NetBSD,但是IIRC,旧的FreeBSD做了同样的事情:这个值是一个带符号的整数(实际上,它只是一个#define预处理器宏,但这使它成为{{1 - 类型常量),但使用它的API采用无符号值。在C中,您可以将int传递给采用-1的函数,它与传递unsigned int(4294967295)相同。 Python没有那些转换规则,因此模块只需将-1转换为UINT_MAX(2147483647),这样更安全,并且您将不会拥有超过21亿个信号量。我相信当前的FreeBSD及其后代,比如OS X,只是给你INT_MAX(32767),这使得这不必要,但可能还有其他操作系统也是如此。

答案 1 :(得分: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

这可能是suggest文档改进的一个好例子。如果你会这么善良。

文档提示

  

我在文档中找不到任何指定负值意味着什么的内容

它实际上是依赖于平台的,使用上面的命令获取实际值。

虽然似乎没有针对maxsize的{​​{1}}文档,但标准库的Queue文档可以提供:

  

如果maxsize小于或等于零,则队列大小为无限。

multiprocessing's guide说明了

  

Queue类是Queue.Queue的近乎克隆。

因此,我认为假设您的解释是正确的,即创建OS支持的最大队列是公平的。实际上,我们不必回归假设,这是事实:

血腥细节

如果您想了解如何在编译时确定multiprocessing的详细信息,请继续阅读。

  

是否有任何文件可以澄清这种神奇的价值?

不 - 如果你真的想知道,你必须遵循代码...对于CPython,有这些#include文件multiprocessing.h和平台C库的limits.h,后者最终被Python.h包括在内。换句话说,_multiprocessing.SemLock.SEM_VALUE_MAX取决于主机平台。

根据Open Group关于limits.h的文档,它定义为

  

信号量可能具有的最大值。最低可接受值:_POSIX_SEM_VALUE_MAX

因此SEM_VALUE_MAX最小,而 又被定义为:

  

信号量可能具有的最大值。价值:32 767