Mã nguồn: lib/queue.py Lib/queue.py
Mô-đun queue thực hiện các hàng đợi đa nhà sản xuất, nhiều người tiêu dùng. Nó đặc biệt hữu ích trong lập trình luồng khi thông tin phải được trao đổi một cách an toàn giữa nhiều luồng. Lớp Queue trong mô -đun này thực hiện tất cả các ngữ nghĩa khóa cần thiết.
Mô -đun thực hiện ba loại hàng đợi, chỉ khác nhau theo thứ tự mà các mục được truy xuất. Trong một hàng đợi FIFO, các nhiệm vụ đầu tiên được thêm vào là lần đầu tiên được truy xuất. Trong một hàng đợi Lifo, mục được thêm gần đây nhất là lần đầu tiên được truy xuất (hoạt động như một ngăn xếp). Với hàng đợi ưu tiên, các mục được giữ được sắp xếp (sử dụng mô -đun heapq) và mục nhập có giá trị thấp nhất được truy xuất trước.
Trong nội bộ, ba loại hàng đợi sử dụng khóa để chặn các luồng cạnh tranh tạm thời; Tuy nhiên, chúng không được thiết kế để xử lý sự tái lập trong một luồng.
Ngoài ra, mô -đun thực hiện một loại hàng đợi FIFO đơn giản, SimpleQueue, có triển khai cụ thể cung cấp các đảm bảo bổ sung để đổi lấy chức năng nhỏ hơn.
Mô -đun queue xác định các lớp và ngoại lệ sau:
classqueue.queue (maxsize = 0) ¶ queue.Queue(maxsize=0)¶Người xây dựng cho một hàng đợi FIFO. MaxSize là một số nguyên đặt giới hạn trên đối với số lượng mục có thể được đặt trong hàng đợi. Chèn sẽ chặn khi đã đạt được kích thước này, cho đến khi các mục hàng đợi được tiêu thụ. Nếu tối đa nhỏ hơn hoặc bằng 0, kích thước hàng đợi là vô hạn.
classqueue.lifoqueue (maxsize = 0) ¶ queue.LifoQueue(maxsize=0)¶Người xây dựng cho một hàng đợi LIFO. MaxSize là một số nguyên đặt giới hạn trên đối với số lượng mục có thể được đặt trong hàng đợi. Chèn sẽ chặn khi đã đạt được kích thước này, cho đến khi các mục hàng đợi được tiêu thụ. Nếu tối đa nhỏ hơn hoặc bằng 0, kích thước hàng đợi là vô hạn.
classqueue.priorityqueue (MaxSize = 0) ¶queue.PriorityQueue(maxsize=0)¶Người xây dựng cho một hàng đợi ưu tiên. MaxSize là một số nguyên đặt giới hạn trên đối với số lượng mục có thể được đặt trong hàng đợi. Chèn sẽ chặn khi đã đạt được kích thước này, cho đến khi các mục hàng đợi được tiêu thụ. Nếu tối đa nhỏ hơn hoặc bằng 0, kích thước hàng đợi là vô hạn.
Các mục có giá trị thấp nhất được lấy đầu tiên (mục có giá trị thấp nhất là bản được trả lại bởi sorted(list(entries))[0]). Một mẫu điển hình cho các mục là một tuple trong mẫu: (priority_number, data).
Nếu các phần tử dữ liệu không thể so sánh được, dữ liệu có thể được gói trong một lớp bỏ qua mục dữ liệu và chỉ so sánh số ưu tiên:
from dataclasses import dataclass, field from typing import Any @dataclass(order=True) class PrioritizedItem: priority: int item: Any=field(compare=False)
classqueue.simplequeue¶ queue.SimpleQueue¶Người xây dựng cho một hàng đợi FIFO không giới hạn. Hàng đợi đơn giản thiếu chức năng nâng cao như theo dõi nhiệm vụ.
Mới trong phiên bản 3.7.
Exceptionqueue.empty¶ queue.Empty¶Ngoại lệ được nâng lên khi không chặn get() (hoặc import threading import queue q = queue.Queue() def worker(): while True: item = q.get() print(f'Working on {item}') print(f'Finished {item}') q.task_done() # Turn-on the worker thread. threading.Thread(target=worker, daemon=True).start() # Send thirty task requests to the worker. for item in range(30): q.put(item) # Block until all tasks are done. q.join() print('All work completed') 0) được gọi trên một đối tượng Queue trống.
ngoại lệ.Full queue.Full¶Ngoại lệ được nâng lên khi không chặn import threading import queue q = queue.Queue() def worker(): while True: item = q.get() print(f'Working on {item}') print(f'Finished {item}') q.task_done() # Turn-on the worker thread. threading.Thread(target=worker, daemon=True).start() # Send thirty task requests to the worker. for item in range(30): q.put(item) # Block until all tasks are done. q.join() print('All work completed') 2 (hoặc import threading import queue q = queue.Queue() def worker(): while True: item = q.get() print(f'Working on {item}') print(f'Finished {item}') q.task_done() # Turn-on the worker thread. threading.Thread(target=worker, daemon=True).start() # Send thirty task requests to the worker. for item in range(30): q.put(item) # Block until all tasks are done. q.join() print('All work completed') 3) được gọi trên một đối tượng Queue đã đầy.
Hàng đợi đối tượng
Các đối tượng hàng đợi (Queue, import threading import queue q = queue.Queue() def worker(): while True: item = q.get() print(f'Working on {item}') print(f'Finished {item}') q.task_done() # Turn-on the worker thread. threading.Thread(target=worker, daemon=True).start() # Send thirty task requests to the worker. for item in range(30): q.put(item) # Block until all tasks are done. q.join() print('All work completed') 6 hoặc import threading import queue q = queue.Queue() def worker(): while True: item = q.get() print(f'Working on {item}') print(f'Finished {item}') q.task_done() # Turn-on the worker thread. threading.Thread(target=worker, daemon=True).start() # Send thirty task requests to the worker. for item in range(30): q.put(item) # Block until all tasks are done. q.join() print('All work completed') 7) cung cấp các phương thức công khai được mô tả dưới đây.
Hàng đợi.qsize () ¶qsize()¶Trả lại kích thước gần đúng của hàng đợi. Lưu ý, qsize ()> 0 không đảm bảo rằng một get () tiếp theo sẽ không chặn, cũng không phải Qsize () 0 không đảm bảo rằng một get () tiếp theo sẽ không chặn.
Đơn giản.Empty () ¶empty()¶Trả lại import threading import queue q = queue.Queue() def worker(): while True: item = q.get() print(f'Working on {item}') print(f'Finished {item}') q.task_done() # Turn-on the worker thread. threading.Thread(target=worker, daemon=True).start() # Send thirty task requests to the worker. for item in range(30): q.put(item) # Block until all tasks are done. q.join() print('All work completed') 8 Nếu hàng đợi trống, import threading import queue q = queue.Queue() def worker(): while True: item = q.get() print(f'Working on {item}') print(f'Finished {item}') q.task_done() # Turn-on the worker thread. threading.Thread(target=worker, daemon=True).start() # Send thirty task requests to the worker. for item in range(30): q.put(item) # Block until all tasks are done. q.join() print('All work completed') 9 khác. Nếu trống () trả về import threading import queue q = queue.Queue() def worker(): while True: item = q.get() print(f'Working on {item}') print(f'Finished {item}') q.task_done() # Turn-on the worker thread. threading.Thread(target=worker, daemon=True).start() # Send thirty task requests to the worker. for item in range(30): q.put(item) # Block until all tasks are done. q.join() print('All work completed') 9, nó không đảm bảo rằng một cuộc gọi tiếp theo để nhận () sẽ không chặn.
Đơn giảnput(item, block=True, timeout=None)¶Đặt mục vào hàng đợi. Phương pháp không bao giờ chặn và luôn luôn thành công (ngoại trừ các lỗi cấp thấp tiềm năng như không phân bổ bộ nhớ). Khối ARGS tùy chọn và thời gian chờ bị bỏ qua và chỉ được cung cấp để tương thích với heapq8.
Chi tiết triển khai CPYThon: Phương pháp này có triển khai C được tái lập. Đó là, một cuộc gọi import threading import queue q = queue.Queue() def worker(): while True: item = q.get() print(f'Working on {item}') print(f'Finished {item}') q.task_done() # Turn-on the worker thread. threading.Thread(target=worker, daemon=True).start() # Send thirty task requests to the worker. for item in range(30): q.put(item) # Block until all tasks are done. q.join() print('All work completed') 2 hoặc get() có thể bị gián đoạn bởi một cuộc gọi import threading import queue q = queue.Queue() def worker(): while True: item = q.get() print(f'Working on {item}') print(f'Finished {item}') q.task_done() # Turn-on the worker thread. threading.Thread(target=worker, daemon=True).start() # Send thirty task requests to the worker. for item in range(30): q.put(item) # Block until all tasks are done. q.join() print('All work completed') 2 khác trong cùng một luồng mà không bị dừng hoặc làm hỏng trạng thái nội bộ bên trong hàng đợi. Điều này làm cho nó phù hợp để sử dụng trong các bộ hủy diệt như các phương thức SimpleQueue2 hoặc các cuộc gọi lại SimpleQueue3. This method has a C implementation which is reentrant. That is, a import threading import queue q = queue.Queue() def worker(): while True: item = q.get() print(f'Working on {item}') print(f'Finished {item}') q.task_done() # Turn-on the worker thread. threading.Thread(target=worker, daemon=True).start() # Send thirty task requests to the worker. for item in range(30): q.put(item) # Block until all tasks are done. q.join() print('All work completed') 2 or get() call can be interrupted by another import threading import queue q = queue.Queue() def worker(): while True: item = q.get() print(f'Working on {item}') print(f'Finished {item}') q.task_done() # Turn-on the worker thread. threading.Thread(target=worker, daemon=True).start() # Send thirty task requests to the worker. for item in range(30): q.put(item) # Block until all tasks are done. q.join() print('All work completed') 2 call in the same thread without deadlocking or corrupting internal state inside the queue. This makes it appropriate for use in destructors such as SimpleQueue2 methods or SimpleQueue3 callbacks.
Đơn giản.put_nowait (mục) ¶put_nowait(item)¶Tương đương với queue9, được cung cấp cho khả năng tương thích với SimpleQueue5.
Đơn giảnget(block=True, timeout=None)¶Hủy bỏ và trả lại một mục từ hàng đợi. Nếu khối args tùy chọn là đúng và thời gian chờ là queue6 (mặc định), khối nếu cần thiết cho đến khi có sẵn một mục. Nếu thời gian chờ là một số dương, nó sẽ chặn hầu hết các thời gian chờ giây và tăng ngoại lệ Queue1 nếu không có mục nào trong thời gian đó. Mặt khác (khối là sai), hãy trả lại một mục nếu có sẵn ngay lập tức, nếu không, hãy tăng ngoại lệ Queue1 (thời gian chờ bị bỏ qua trong trường hợp đó).
Đơn giản.get_nowait ()get_nowait()¶Tương đương với Queue5.
Xem thêm
Lớp queue0Một lớp hàng đợi để sử dụng trong bối cảnh đa xử lý (chứ không phải đa luồng).
queue1 là một triển khai thay thế các hàng đợi không giới hạn với các hoạt động ATOMIC queue2 và queue3 nhanh không yêu cầu khóa và cũng hỗ trợ lập chỉ mục.