2013-05-09 35 views
9

Tôi chỉ muốn biết cách xóa hàng đợi đa xử lý trong python như hàng đợi python bình thường. Ví dụ:Cách xóa hàng đợi đa xử lý trong python

from multiprocessing import Queue # multiprocessing queue 
from Queue import Queue   # normal queue 

multi_q = Queue() 
normal_q = Queue() 
multi_q.clear()     # or multi_q.queue.clear() 

đối tượng 'Queue' không có thuộc tính 'rõ ràng'

normal_q.queue.clear() # This is ok 
+0

Có trong trường hợp hàng đợi bình thường, bạn có thể làm sạch nội dung của nó theo normal_q.queue.clear(). Tuy nhiên tôi cần phải sử dụng một đa xử lý. Cảm ơn bạn đã trả lời – FelipeG

+5

Đây không phải là câu trả lời cho câu hỏi cơ bản của bạn, nhưng tôi cảm thấy bắt buộc phải chỉ ra rằng các câu lệnh 'import' trong câu hỏi của bạn sẽ ghi đè lên một câu hỏi khác. Nếu bạn sử dụng mã bạn đã viết ở trên, cả hai 'multi_q' và' normal_q' sẽ là các cá thể 'Queue.Queue' thông thường. Để làm cho nó hoạt động, bạn chỉ cần nhập các mô-đun và sử dụng tên đầy đủ cho các lớp (ví dụ: 'multi_q = multiprocessing.Queue()') hoặc sử dụng từ khóa 'as' để nhập chúng dưới các tên khác nhau (ví dụ' từ Hàng đợi Hàng đợi nhập như qQueue'). – Blckknght

Trả lời

1

Không có cách nào trực tiếp thanh toán bù trừ một multiprocessing.Queue.

Tôi tin rằng gần nhất bạn có là close(), nhưng điều đó chỉ đơn giản nói rằng không có thêm dữ liệu nào sẽ được đẩy vào hàng đợi đó và sẽ đóng nó khi tất cả dữ liệu đã được flushed vào đường ống.

+0

Cảm ơn bạn đã trả lời, tôi đã cố gắng sử dụng close() nhưng vấn đề là tôi có vòng lặp while: while not someQueue.empty(): do something end process Vì vậy, tôi muốn xóa hàng đợi khỏi quá trình khác, do đó vòng lặp while kết thúc. nhưng nếu tôi đóng hàng đợi nó sẽ báo lỗi – FelipeG

32

Vì vậy, tôi đi xem lớp Queue, và bạn có thể thử mã này:

while not some_queue.empty(): 
    some_queue.get() # as docs say: Remove and return an item from the queue. 
+0

Thủ thuật này hoạt động và câu trả lời của bạn là đúng. – Raoul

+12

'trong khi không some_queue.empty():' là nhiều pythonic – Jonathan

+2

Câu trả lời này nên đã được chọn vì nó thực sự cung cấp một giải pháp thay vì chỉ nói "không có cách trực tiếp để làm điều đó". – exfizik

1

Là một built-in Class thiếu phương pháp mà bạn muốn? Phân lớp lớp dựng sẵn và thêm phương thức mà bạn nghĩ sẽ có ở đó!

from Queue import Queue, Empty 

class ClearableQueue(Queue): 

    def clear(self): 
     try: 
      while True: 
       self.get_nowait() 
     except Empty: 
      pass 

lớp ClearableQueue của bạn được thừa hưởng tất cả sự tốt lành (và hành vi) của built-in Queue lớp, và có phương pháp bây giờ bạn muốn.

Chỉ cần sử dụng q = ClearableQueue() ở tất cả các nơi bạn đã sử dụng q = Queue() và gọi q.clear() khi bạn muốn.

+0

Mã này có một lỗi, bởi vì trong Python các 'get_nowait' chức năng có thể ném' Empty' ngay cả khi hàng đợi là đầy đủ (có, thực sự). –

+0

@GeoffreyIrving: Tôi đoán tôi sẽ xem xét rằng một lỗi trong Python ... không phải mã ví dụ của tôi! Nghiêm túc: bạn đang đề cập đến tính năng * được ghi chép *? Hay bạn chỉ đang chỉ ra điều kiện chủng tộc mà * vào thời điểm phương thức này trả về, ai đó có thể đã đẩy thứ gì đó khác vào hàng đợi *. Trong trường hợp đó ... vâng, vâng, điều đó có thể xảy ra. Xử lý đa luồng là như thế. Nhưng đó vẫn không phải là lỗi trong việc thực hiện đề xuất của tôi về 'clear()'. –

Các vấn đề liên quan