2011-11-19 21 views
16

Có ai biết cách lặp đi lặp lại các yếu tố của một số Queue.Queuemà không cần xóa chúng khỏi Hàng đợi. Tôi có chương trình nhà sản xuất/người tiêu dùng, nơi các mặt hàng được xử lý được chuyển qua sử dụng Queue.Queue và tôi muốn có thể in các mặt hàng còn lại là gì. Bất kỳ ý tưởng?Làm cách nào để lặp lại các mục Queue.Queue bằng Python?

Trả lời

25

Bạn có thể lặp qua một bản sao của các cửa hàng dữ liệu cơ bản:

for elem in list(q.queue) 

Cho dù này bỏ qua ổ khóa cho các đối tượng Queue, bản danh sách là một hoạt động nguyên tử và nó sẽ làm việc ra tốt đẹp.

Nếu bạn muốn giữ khóa, tại sao không kéo tất cả các tác vụ ra khỏi hàng đợi, sao chép danh sách của bạn và sau đó đặt chúng trở lại.

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

'cho elem trong danh sách (q.queue)' kết quả trong 'TypeError: 'Queue' đối tượng không thể lặp lại trong Python 3. Có lẽ tôi đang làm điều gì đó sai? –

+1

@ macmadness86 Có vẻ như bạn có một lớp khác với "q" là đối tượng mã có thuộc tính "hàng đợi" chứa đối tượng Queue. Hãy thử điều này: '' cho elem trong danh sách (q.queue.queue) ''. –

+0

Roger đó. Sẽ tuân thủ. Cảm ơn vì tiền hỗ trợ. (thông báo này được lên lịch xóa) –

2

Bạn có thể phân lớp queue.Queue để đạt được điều này một cách thread-safe:

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

yếu tố hàng đợi Liệt kê mà không tốn nhiều họ:

>>> from Queue import Queue 
>>> q = Queue() 
>>> q.put(1) 
>>> q.put(2) 
>>> q.put(3) 
>>> print list(q.queue) 
[1, 2, 3] 

Sau khi phẫu thuật, bạn nhận được vẫn xử lý chúng :

>>> q.get() 
1 
>>> print list(q.queue) 
[2, 3] 
Các vấn đề liên quan