2015-07-05 28 views
12

Trong Python trong khi sử dụng đa xử mô-đun có 2 loại hàng đợi:Queue vs JoinableQueue bằng Python

  • Queue
  • JoinableQueue.

Sự khác nhau giữa chúng là gì?

Queue

from multiprocessing import Queue 
q = Queue() 
q.put(item) # Put an item on the queue 
item = q.get() # Get an item from the queue 

JoinableQueue

from multiprocessing import JoinableQueue 
q = JoinableQueue() 
q.task_done() # Signal task completion 
q.join() # Wait for completion 

Trả lời

16

JoinableQueue có phương pháp join()task_done(), mà Queue có không.


lớp multiprocessing.Queue ([maxsize])

Trả về một quá trình xếp hàng chia sẻ thực hiện bằng cách sử dụng đường ống và một vài ổ khóa/Cột. Khi một quá trình đầu tiên đặt một mục trên hàng đợi, một luồng nạp được bắt đầu chuyển các đối tượng từ một bộ đệm vào đường ống.

Các Queue.Empty thông thường và ngoại lệ Queue.Full từ mô-đun Queue thư viện chuẩn của được nâng lên để báo hiệu timeout.

Hàng đợi thực hiện tất cả các phương thức của Queue.Queue ngoại trừ task_done() và join().


lớp multiprocessing.JoinableQueue ([maxsize])

JoinableQueue, một lớp con Queue, là một hàng đợi mà bổ sung có task_done() và join() phương pháp.

task_done()

biết rằng doanh nghiệp là một nhiệm vụ trước đây là enqueued hoàn tất. Được sử dụng bởi các chủ đề người tiêu dùng hàng đợi. Đối với mỗi get() được sử dụng để lấy một nhiệm vụ, một lệnh gọi tới task_done() cho hàng đợi rằng quá trình xử lý tác vụ hoàn tất.

Nếu tham gia() hiện đang chặn, nó sẽ tiếp tục khi tất cả các mục đã được xử lý (nghĩa là một cuộc gọi task_done() đã được nhận cho mỗi mục đã được đặt() vào hàng đợi).

Tăng giá trị lỗi nếu được gọi nhiều lần hơn các mục được đặt trong hàng đợi.

tham gia()

Dừng cho đến khi tất cả các mục trong hàng đợi đã được nhận và xử lý.

Số lượng công việc chưa hoàn thành tăng lên bất cứ khi nào một mục được thêm vào hàng đợi. Số đếm đi xuống bất cứ khi nào một sợi tiêu dùng gọi task_done() để cho biết rằng mục này đã được lấy ra và tất cả các công việc trên đó là hoàn tất.Khi số lượng công việc chưa hoàn thành giảm xuống 0, hãy tham gia() unblocks.


Nếu bạn sử dụng JoinableQueue sau đó bạn phải gọi JoinableQueue.task_done() cho từng nhiệm vụ loại bỏ khỏi hàng đợi hoặc khác semaphore dùng để đếm số lượng các nhiệm vụ chưa hoàn thành cuối cùng có thể tràn, nâng cao một ngoại lệ.