web-dev-qa-db-ja.com

PythonでQueue.Queueアイテムを反復する方法は?

Queue.Queueの要素を反復処理するPythonの方法を知っている人はいますかwithoutキューからそれらを削除します。処理されるアイテムがQueue.Queueを使用して渡されるプロデューサー/コンシューマータイプのプログラムがあり、残りのアイテムが何であるかを印刷できるようにしたい。何か案は?

32
pgilmon

基になるデータストアのコピーをループできます。

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
40

キュー要素を消費せずにリストする:

>>> 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]
10
Omer Dagan

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)
6
Erwin Mayer