Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python队列窥视中的错误_Python_Multithreading - Fatal编程技术网

Python队列窥视中的错误

Python队列窥视中的错误,python,multithreading,Python,Multithreading,我正在尝试实现一个队列窥视,它阻止类中的空self.Queue: def peek(self): while self.queue.empty(): self.queue.not_empty.wait() queue_data = self.queue.queue return queue_data[0] 这在线程中被调用,但是当我在线程上调用join()时,wait()似乎

我正在尝试实现一个队列窥视,它阻止类中的空
self.Queue

        def peek(self):
            while self.queue.empty():
                self.queue.not_empty.wait()
            queue_data = self.queue.queue
            return queue_data[0]

这在线程中被调用,但是当我在线程上调用
join()
时,
wait()
似乎放弃了等待,并且不返回数据。这是解决这个问题的错误方法吗?

我通过将队列扩展到PeekQueue并添加peek()方法来解决这个问题。我从Queue的get()方法复制了代码,并将其替换为在最后调用_get,并从出列中删除索引

更好的解决方案可能是将队列操作传递给处理所有计时的函数


class PeekQueue(Queue):
    def peek(self, block=True, timeout=None):
        '''Return first item from queue without removing it

        If optional args 'block' is true and 'timeout' is None (the default),
        block if necessary until an item is available. If 'timeout' is
        a non-negative number, it blocks at most 'timeout' seconds and raises
        the Empty exception if no item was available within that time.
        Otherwise ('block' is false), return an item if one is immediately
        available, else raise the Empty exception ('timeout' is ignored
        in that case).
        '''
        with self.not_empty:
            if not block:
                if not self._qsize():
                    raise Empty
            elif timeout is None:
                while not self._qsize():
                    self.not_empty.wait()
            elif timeout < 0:
                raise ValueError("'timeout' must be a non-negative number")
            else:
                endtime = time() + timeout
                while not self._qsize():
                    remaining = endtime - time()
                    if remaining <= 0.0:
                        raise Empty
                    self.not_empty.wait(remaining)
            item = self.queue[0]     #<----------- THE ONLY CHANGE from get()
            self.not_full.notify()
            return item


类队列(队列):
def peek(自身,块=真,超时=无):
''从队列中返回第一项,但不删除它
如果可选参数“block”为true,“timeout”为None(默认值),
如有必要,请阻止,直到项目可用。如果“超时”为
非负数,它最多阻止“超时”秒并引发
如果在此时间内没有可用项,则为空异常。
否则('block'为false),如果立即返回项目,则返回该项目
可用,否则引发空异常('超时'被忽略
在那种情况下)。
'''
如果self.not_为空:
如果不阻止:
如果不是自我。qsize():
空举
elif超时为无:
而不是自我。qsize()
self.not_empty.wait()
elif超时<0:
raise VALUERROR(“'timeout'必须是非负数”)
其他:
endtime=time()+超时
而不是自我。qsize()
剩余=结束时间-时间()
如果剩余