如何将元素放在Python队列的底部

时间:2016-02-12 12:49:13

标签: python multithreading queue

我有一个由不同线程填充的队列。 我有一个线程,我从队列中获取项目,然后将它们发送到另一个目的地。当最后一个操作失败时,我想再次将元素放入队列中,但是在队列的底部,因为我希望dequeuer Thread将它们作为第一优先级出列。有没有办法做到这一点?也许使用其他类而不是Queue.queue?

2 个答案:

答案 0 :(得分:2)

deque怎么样?

  

Deques支持线程安全,内存有效的追加和双端队列的弹出,在任一方向上具有大致相同的O(1)性能。

答案 1 :(得分:1)

这是一个实现 - 它基本上是Queue.put methodself._put(item)替换为self.queue.appendleft(item)

from Queue import Queue

class MyQueue(Queue):
    def putleft(self, item, block=True, timeout=None):
        self.not_full.acquire()
        try:
            if self.maxsize > 0:
                if not block:
                    if self._qsize() == self.maxsize:
                        raise Full
                elif timeout is None:
                    while self._qsize() == self.maxsize:
                        self.not_full.wait()
                elif timeout < 0:
                    raise ValueError("'timeout' must be a non-negative number")
                else:
                    endtime = _time() + timeout
                    while self._qsize() == self.maxsize:
                        remaining = endtime - _time()
                        if remaining <= 0.0:
                            raise Full
                        self.not_full.wait(remaining)
            self.queue.appendleft(item)
            self.unfinished_tasks += 1
            self.not_empty.notify()
        finally:
            self.not_full.release()