2011-11-19 11 views
16

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

答えて

25

あなたは、基になるデータストアのコピーをループすることができます

for elem in list(q.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 
+1

'for elem in list(q.queue)'の結果は 'TypeError: 'の結果となります。'キュー'オブジェクトはPython 3ではiterableではありません。おそらく私は何か間違っていますか? –

+1

@ macmadness86キューオブジェクトを保持する "queue"属性を持つコードオブジェクトである "q"という別のレイヤーがあるようです。これを試してください: '' elem in list(q.queue.queue) ''。 –

+0

ロジャー。遵守します。先端に感謝します。 (このメッセージは削除予定です) –

2

あなたがスレッドセーフな方法でこれを達成するために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) 
0

はそれらを消費することなく、キューの要素をリスト:

>>> 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] 
関連する問題