【问题标题】:Python 3.6: "AttributeError: 'SimpleQueue' object has no attribute '_poll'"Python 3.6:“AttributeError:‘SimpleQueue’对象没有属性‘_poll’”
【发布时间】:2017-10-05 16:18:47
【问题描述】:

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

错误来自消费者进程(当 sample_queue 为 Queue 时,一切正常,当 sample_queue 为 SimpleQueue 时,事情中断):

      def frame_update(i):
        while not self.sample_queue.empty():
            sample = self.sample_queue.get()
            for line in lines:

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

    def empty(self):
      return not self._poll()

self._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._reader: ...

c1 = PipeConnection(h1, writable=duplex)
c2 = PipeConnection(h2, readable=duplex)

好的,太好了。 _reader 将是一个 PipeConnection 并且管道连接有这个方法:

      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._reader._poll 而不是 self._reader.poll 吗?还是我在继承层次结构中遗漏了什么?

2) PipeConnection _poll 例程需要一个超时参数,所以#1 不应该工作...

*) -- 还有其他一些我缺少的 PipeConnection _poll 绑定吗?

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

编辑:经过进一步审查,我可以看到 PipeConnection 是 _ConnectionBase 的子类,它确实有一个 'poll' 方法,并且绑定了一个默认的超时参数。

所以问题是:SimpleQueue 什么时候初始化和设置

self._poll = self._reader.poll

为什么不向上类层次结构从 _ConnectionBase 中获取它?

【问题讨论】:

    标签: python windows python-3.x queue python-multiprocessing


    【解决方案1】:

    在查看了 Queue 类型的工作原理以及 SimpleQueue 不工作的原因之后,我发现 Queue 设置了 _poll 方法 'after_fork' 和之前一样。 SimpleQueue 没有。通过更改 setstate 方法添加 self._poll = self._reader.poll 如下(queues.py,第 338 行),SimpleQueue 工作

    def __setstate__(self, state):
        (self._reader, self._writer, self._rlock, self._wlock) = state
        self._poll = self._reader.poll
    

    除非我真的误解了某些东西,否则对我来说似乎是一个错误。我将提交一个错误报告并参考这篇文章。希望这对某人有帮助!

    http://bugs.python.org/issue30301

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-31
      • 1970-01-01
      • 1970-01-01
      • 2021-08-20
      • 1970-01-01
      • 2020-09-11
      • 2018-11-19
      • 1970-01-01
      相关资源
      最近更新 更多