【发布时间】: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