有一些代码示例指定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支持的最大队列?是否有任何文件可以澄清这种神奇的价值?
答案 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_MAX
或INT_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小于或等于零,则队列大小为无限。
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