Python multiprocessing.Queue文件在Cygwin下存在错误

Python multiprocessing.Queue文件在Cygwin下存在错误,python,cygwin,multiprocessing,message-queue,Python,Cygwin,Multiprocessing,Message Queue,尝试从Cygwin的多处理模块创建队列时,我遇到一个奇怪的间歇性错误: Traceback (most recent call last): File "test.py", line 3, in <module> multiprocessing.Queue() File "/usr/lib/python2.6/multiprocessing/__init__.py", line 213, in Queue return Queue(maxsize) Fil

尝试从Cygwin的多处理模块创建队列时,我遇到一个奇怪的间歇性错误:

Traceback (most recent call last):
  File "test.py", line 3, in <module>
    multiprocessing.Queue()
  File "/usr/lib/python2.6/multiprocessing/__init__.py", line 213, in Queue
    return Queue(maxsize)
  File "/usr/lib/python2.6/multiprocessing/queues.py", line 37, in __init__
    self._rlock = Lock()
  File "/usr/lib/python2.6/multiprocessing/synchronize.py", line 117, in __init__
    SemLock.__init__(self, SEMAPHORE, 1, 1)
  File "/usr/lib/python2.6/multiprocessing/synchronize.py", line 49, in __init__
    sl = self._semlock = _multiprocessing.SemLock(kind, value, maxvalue)
OSError: [Errno 17] File exists
虽然错误只发生在25%的时间里

目前,为了“解决”这个问题,我有一个while循环,它不断地创建
队列
s,直到错误没有出现,但我更愿意找出它发生的原因。我试着查看记录的源文件,但即使一直追溯到c源代码,也没有发现任何线索

我在Windows7 64位上运行Cygwin的Python2.6.7。如果我通过本机windows python从cmd运行此命令,即不从Cygwin运行此命令,则不会出现问题

更新: 更仔细地观察源代码,CreateSemaphore C函数似乎接受了一个“name”参数,如果具有此名称的信号量已经存在,则会标记错误
error\u ready\u exists
。但是,在Modules/_multiprocessing/semaphore.c中的python源代码中,调用此函数时没有名称参数,因此不应发生这种情况。我猜这只是cygwin的信号量实现中的一个怪癖

编辑2: 我现在有一个这样的设置:

import multiprocessing

for i in range(10):
    count = 0
    while True:
        try:
            q = multiprocessing.Queue()
            break
        except OSError as exc:
            if exc.errno == 17:
                count += 1
            else:
                raise # catch other errors, but this has never happened
    print "iterations %d" % count
我注意到了一个怪癖:队列构造函数失败的次数总是小于或等于3003次,而且经常出现3000次。此外,一旦构造函数成功了一次,它就不会在for循环的其余迭代中再次失败

我还是被难住了!我尝试过在队列本身上使用gc.collect、time.sleep、calling close或del,但这些似乎都没有任何影响。如果这确实是操作系统清理信号量的问题,那么是否有必要通过系统调用“强制”这样做?

在cygwin python 2.6.8中也被破坏了

错误(如下)是由于
多处理.futures
使用
多处理队列
。真倒霉我希望用它来代替 gevent(因为gevent使用猴子补丁)

$。/eg3
回溯(最近一次呼叫最后一次):
文件“/eg3”,第13行,在
以concurrent.futures.ProcessPoolExecutor(max_workers=4)作为执行器:
文件“/usr/lib/python2.6/site packages/concurrent/futures/process.py”,第275行,在__
额外_排队_呼叫)
文件“/usr/lib/python2.6/site packages/multiprocessing-2.6.2.1-py2.6-cygwin-1.7.16-i686.egg/multiprocessing/__init___;.py”,第219行,在队列中
返回队列(最大大小)
文件“/usr/lib/python2.6/site packages/multiprocessing-2.6.2.1-py2.6-cygwin-1.7.16-i686.egg/multiprocessing/queues.py”,第37行,在__
self.\u rlock=Lock()
文件“/usr/lib/python2.6/site packages/multiprocessing-2.6.2.1-py2.6-cygwin-1.7.16-i686.egg/multiprocessing/synchronize.py”,第117行,在__
SemLock.\uuuuu init\uuuuu(self,信号量,1,1)
文件“/usr/lib/python2.6/site packages/multiprocessing-2.6.2.1-py2.6-cygwin-1.7.16-i686.egg/multiprocessing/synchronize.py”,第49行,在__
sl=self.\u semlock=\u multiprocessing.semlock(种类、值、最大值)
OSError:[Errno 17]文件存在

我无法在Linux上重现这一点,这似乎是一个特定于窗口的问题。我的猜测是-这是队列信号量的垃圾收集问题,可能是windows上识别信号量的方式?但这只是一个猜测,我在这里的唯一输入是它似乎是特定于windows的。@Not_a_Golfer我安装了一个windows python版本并进行了测试(应该首先做这件事)。。。看起来这是一个Cygwin特定的问题。在Windows 7上的Cygwin中,在Python 2.6.5上进行了测试,但无法复制。uname-a从Cygwin内部给出Cygwin\u NT-6.1-WOW64。。。1.7.9(0.237/5/3)我也在使用Win7、python 2.6.7、cygwin 1.7.11,并且运行良好。
import multiprocessing

for i in range(10):
    count = 0
    while True:
        try:
            q = multiprocessing.Queue()
            break
        except OSError as exc:
            if exc.errno == 17:
                count += 1
            else:
                raise # catch other errors, but this has never happened
    print "iterations %d" % count
$ python
Python 2.6.8 (unknown, Jun  9 2012, 11:30:32) 
[GCC 4.5.3] on cygwin
$ ./eg3
Traceback (most recent call last):
  File "./eg3", line 13, in <module>
    with concurrent.futures.ProcessPoolExecutor(max_workers=4) as executor:
  File "/usr/lib/python2.6/site-packages/concurrent/futures/process.py", line 275, in __init__
    EXTRA_QUEUED_CALLS)
  File "/usr/lib/python2.6/site-packages/multiprocessing-2.6.2.1-py2.6-cygwin-1.7.16-i686.egg/multiprocessing/__init__.py", line 219, in Queue
    return Queue(maxsize)
  File "/usr/lib/python2.6/site-packages/multiprocessing-2.6.2.1-py2.6-cygwin-1.7.16-i686.egg/multiprocessing/queues.py", line 37, in __init__
    self._rlock = Lock()
  File "/usr/lib/python2.6/site-packages/multiprocessing-2.6.2.1-py2.6-cygwin-1.7.16-i686.egg/multiprocessing/synchronize.py", line 117, in __init__
    SemLock.__init__(self, SEMAPHORE, 1, 1)
  File "/usr/lib/python2.6/site-packages/multiprocessing-2.6.2.1-py2.6-cygwin-1.7.16-i686.egg/multiprocessing/synchronize.py", line 49, in __init__
    sl = self._semlock = _multiprocessing.SemLock(kind, value, maxvalue)
OSError: [Errno 17] File exists