Python 3.6:“;属性错误:';SimpleQueue';对象没有属性'_投票'&引用;

Python 3.6:“;属性错误:';SimpleQueue';对象没有属性'_投票'&引用;,python,windows,python-3.x,queue,python-multiprocessing,Python,Windows,Python 3.x,Queue,Python Multiprocessing,当我使用标准队列向流程发送样本时,一切正常。然而,由于我的需求很简单,我尝试使用SimpleQueue,由于某种原因,“empty”方法不起作用。详情如下: 错误来自使用者进程(当sample\u queue为queue时,一切正常;当sample\u queue为SimpleQueue时,一切都中断): 在windows(queues.py)上从Python 3.6执行sample_queue.empty()--SimpleQueue.empty()时,我们得到: 其中self.\u poll

当我使用标准队列向流程发送样本时,一切正常。然而,由于我的需求很简单,我尝试使用SimpleQueue,由于某种原因,“empty”方法不起作用。详情如下:

错误来自使用者进程(当sample\u queue为queue时,一切正常;当sample\u queue为SimpleQueue时,一切都中断):

在windows(queues.py)上从Python 3.6执行sample_queue.empty()--SimpleQueue.empty()时,我们得到:

其中self.\u poll()已由以下人员在init中设置:

  def __init__(self, *, ctx):
    self._reader, self._writer = connection.Pipe(duplex=False)
    self._rlock = ctx.Lock()
    self._poll = self._reader.poll
    if sys.platform == 'win32':
        self._wlock = None
    else:
        self._wlock = ctx.Lock()
因此,我遵循从connection.Pipe(connection.py)设置的self.\u读取器:

好的,太好了。读卡器将是一个管道连接,管道连接有以下方法:

      def _poll(self, timeout):
        if (self._got_empty_message or
                    _winapi.PeekNamedPipe(self._handle)[0] != 0):
            return True
        return bool(wait([self], timeout))
好的,有几个问题:

1) SimpleQueue的init不应该将self.poll分配给self.\u reader.\u poll而不是self.\u reader.poll吗?或者我在继承层次结构中遗漏了什么

2) PipeConnection _poll例程采用超时参数,因此#1不应工作

*)--是否有我丢失的其他管道连接绑定

我错过什么了吗?我使用Python3.6,Windows,在PyCharm中调试,我遵循所有路径,它们都在标准的多处理路径中。我将感谢任何帮助或建议。谢谢

编辑:在进一步检查之后,我可以看到PipeConnection是_ConnectionBase的一个子类,它确实有一个“poll”方法,并且绑定了一个默认的超时参数

所以问题是:当SimpleQueue初始化并设置

self._poll = self._reader.poll

为什么不从_ConnectionBase中获取它呢?

在研究了队列类型工作的原因和SimpleQueue不工作的原因之后,我发现队列将_poll方法设置为“在_fork之后”和之前一样。SimpleQueue没有。通过更改setstate方法来添加self.\u poll=self.\u reader.poll,如下所示(queues.py,第338行),SimpleQueue可以工作

def __setstate__(self, state):
    (self._reader, self._writer, self._rlock, self._wlock) = state
    self._poll = self._reader.poll
除非我真的误解了什么,否则对我来说似乎是个虫子。我将提交一份bug报告并参考这篇文章。希望这对别人有帮助

      def _poll(self, timeout):
        if (self._got_empty_message or
                    _winapi.PeekNamedPipe(self._handle)[0] != 0):
            return True
        return bool(wait([self], timeout))
self._poll = self._reader.poll
def __setstate__(self, state):
    (self._reader, self._writer, self._rlock, self._wlock) = state
    self._poll = self._reader.poll