Queue.Queue
の要素を反復処理するPythonの方法を知っている人はいますかwithoutキューからそれらを削除します。処理されるアイテムがQueue.Queue
を使用して渡されるプロデューサー/コンシューマータイプのプログラムがあり、残りのアイテムが何であるかを印刷できるようにしたい。何か案は?
基になるデータストアのコピーをループできます。
for elem in list(q.queue)
これにより、Queueオブジェクトのロックがバイパスされますが、リストのコピーはアトミック操作であり、正常に機能するはずです。
ロックを保持したい場合は、すべてのタスクをキューから取り出して、リストのコピーを作成してから戻してください。
mycopy = []
while True:
try:
elem = q.get(block=False)
except Empty:
break
else:
mycopy.append(elem)
for elem in mycopy:
q.put(elem)
for elem in mycopy:
# do something with the elements
キュー要素を消費せずにリストする:
>>> from Queue import Queue
>>> q = Queue()
>>> q.put(1)
>>> q.put(2)
>>> q.put(3)
>>> print list(q.queue)
[1, 2, 3]
操作後も、それらを処理できます。
>>> q.get()
1
>>> print list(q.queue)
[2, 3]
queue.Queue
をサブクラス化して、スレッドセーフな方法でこれを実現できます。
import queue
class ImprovedQueue(queue.Queue):
def to_list(self):
"""
Returns a copy of all items in the queue without removing them.
"""
with self.mutex:
return list(self.queue)