如何将元素放在 Python 队列的底部
How to put elements on bottom of Python queue
我有一个由不同线程填充的队列。
我有一个线程,我从队列中获取项目并将它们发送到另一个目的地。当最后一个操作失败时,我想再次将元素放入队列中,但放在队列底部,因为我希望出列线程将它们作为第一优先级出列。有没有办法做到这一点?也许使用其他 class 而不是 Queue.queue?
deque怎么样?
Deques support thread-safe, memory efficient appends and pops from either side of the deque with approximately the same O(1) performance in either direction.
这是一个实现——它基本上是 Queue.put
method 和 self._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()
我有一个由不同线程填充的队列。 我有一个线程,我从队列中获取项目并将它们发送到另一个目的地。当最后一个操作失败时,我想再次将元素放入队列中,但放在队列底部,因为我希望出列线程将它们作为第一优先级出列。有没有办法做到这一点?也许使用其他 class 而不是 Queue.queue?
deque怎么样?
Deques support thread-safe, memory efficient appends and pops from either side of the deque with approximately the same O(1) performance in either direction.
这是一个实现——它基本上是 Queue.put
method 和 self._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()