Queue.Queue
の要素を反復するpythonic方法を知っていますか?キューからそれらを削除しないでください。私は、処理対象のアイテムがQueue.Queue
を使用して渡されるプロデューサ/コンシューマタイプのプログラムを持っており、残りのアイテムが何であるかを印刷できるようにしたいと考えています。何か案は?PythonでQueue.Queueアイテムを反復する方法は?
16
A
答えて
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
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]
関連する問題
- 1. 反復可能なアイテムをスキップするPythonの方法はありますか?
- 2. mongodbで100以上のアイテムを反復する方法
- 3. Terraformで反復可能なアイテムにアプローチする方法
- 4. Pythonでdefaultdict(list)を反復処理する方法は?
- 5. Pythonの反復関数でイテレータを使用する方法は?
- 6. Pythonでこの再帰関数を反復する方法は?
- 7. JComboBoxを反復処理してアイテムを検証する方法
- 8. AndroidでListViewアイテムを反復する
- 9. ジュブラでのアイテムの反復
- 10. Python、反復関数を書く方法
- 11. このJSONを反復でマップして反復する方法
- 12. PythonのQueue.Queue(同期あり)から最も古いアイテムを削除する
- 13. Pythonでファイルを選択的に反復処理する方法
- 14. Pythonでint型の疎行列を反復する方法
- 15. Pythonで辞書の辞書を反復する方法
- 16. Pythonでマップの要素を反復する方法
- 17. Pythonでre.sub()を適切に反復する方法
- 18. Queue.Queue
- 19. アイテム変数を反復する
- 20. req.bodyからオブジェクトの配列内のアイテムを反復する方法は?
- 21. Angularjsにアイテムを追加する際の配列の反復方法は?
- 22. ウォーターでラジオボタンを反復する方法
- 23. mvelでマップを反復する方法
- 24. Python:リストを反復する
- 25. 個々のアイテムを取得するためにJSONObjectを反復する方法
- 26. ファイル内の反復行を削除する方法:python
- 27. Python、tkinterスピンボックスウィジェットの16進値を反復する方法
- 28. Pythonのフォルダを反復処理する方法
- 29. 整数のビットを反復するPythonの方法
- 30. Python CSVリストを反復処理する方法
'for elem in list(q.queue)'の結果は 'TypeError: 'の結果となります。'キュー'オブジェクトはPython 3ではiterableではありません。おそらく私は何か間違っていますか? –
@ macmadness86キューオブジェクトを保持する "queue"属性を持つコードオブジェクトである "q"という別のレイヤーがあるようです。これを試してください: '' elem in list(q.queue.queue) ''。 –
ロジャー。遵守します。先端に感謝します。 (このメッセージは削除予定です) –