Hướng dẫn what does queue () do in python? - hàng đợi () làm gì trong python?

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 () Hàng đợi.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')
8, nó không đảm bảo rằng một cuộc gọi tiếp theo để đặt () sẽ không chặn. Tương tự, 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.

Hàng đợi.full () ¶full()

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 đầy,
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 Full () 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')
8, nó không đảm bảo rằng một cuộc gọi tiếp theo để nhận () sẽ không chặn. Tương tự, nếu Full () 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 để đặt () sẽ không chặn.

Hàng đợi.put (item, block = true, thời gian chờ = none) ¶put(item, block=True, timeout=None)

Đặt mục vào 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ó một khe miễn phí. 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ệ queue7 nếu không có khe cắm miễn phí trong thời gian đó. Mặt khác (khối là sai), hãy đặt một mục vào hàng đợi nếu một khe miễn phí có sẵn ngay lập tức, nếu không sẽ tăng ngoại lệ ____27 (thời gian chờ bị bỏ qua trong trường hợp đó).

Hàng đợi.put_nowait (mục) ¶put_nowait(item)

Tương đương với queue9.

Queue.get (block = true, thời gian chờ = none) ¶get(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 đó).

Trước 3.0 trên các hệ thống POSIX và đối với tất cả các phiên bản trên Windows, nếu khối là đúng và thời gian chờ là queue6, thao tác này sẽ không thể chờ đợi trên khóa bên dưới. Điều này có nghĩa là không có trường hợp ngoại lệ nào có thể xảy ra, và đặc biệt là một sigint sẽ không kích hoạt Queue4.

Hàng đợi.get_nowait ()get_nowait()

Tương đương với Queue5.

Hai phương pháp được cung cấp để hỗ trợ theo dõi xem các tác vụ Enqueued có được xử lý đầy đủ bởi các chủ đề tiêu dùng daemon hay không.

Hàng đợi.task_done () ¶task_done()

Chỉ ra rằng một nhiệm vụ trước đây là hoàn thành. Được sử dụng bởi các chủ đề tiêu dùng hàng đợi. Đối với mỗi get() được sử dụng để tìm kiếm một nhiệm vụ, một cuộc gọi tiếp theo đến Queue7 cho thấy hàng đợi rằng việc xử lý trong nhiệm vụ đã hoàn tất.

Nếu Queue8 hiện đang chặn, nó sẽ tiếp tục khi tất cả các mục đã được xử lý (có nghĩa là cuộc gọi Queue7 đã được nhận cho mọi mục đã đượ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')
2 vào hàng đợi).

Tăng heapq1 nếu được gọi là nhiều lần hơn so với các mục được đặt trong hàng đợi.

Hàng đợi.join () ¶join()

Các khối cho đến khi tất cả các mục trong hàng đợi đã được xử lý và xử lý.

Số lượng các nhiệm vụ chưa hoàn thành tăng lên bất cứ khi nào một mặt hàng được thêm vào hàng đợi. Số lượng đi xuống bất cứ khi nào một luồng người tiêu dùng gọi Queue7 để cho biết rằng mặt hàng đã được lấy và tất cả hoạt động trên đó hoàn tất. Khi số lượng các nhiệm vụ chưa hoàn thành giảm xuống 0, Queue8 không bị chặn.

Ví dụ về cách chờ hoàn thành các nhiệm vụ enqueued:

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')

Đơn giản đối tượng

SimpleQueue Đối tượng cung cấp các phương thức công khai được mô tả dưới đây.

Đơn giản.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.

Đơ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 queue0

Mộ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.

Hàng đợi trong Python là gì?

Hàng đợi là một tập hợp các đối tượng hỗ trợ ngữ nghĩa từ đầu tiên, đầu tiên (FIFO) để chèn và xóa.Các hoạt động chèn và xóa đôi khi được gọi là enqueue và dequeue.Không giống như danh sách hoặc mảng, hàng đợi thường không cho phép truy cập ngẫu nhiên vào các đối tượng mà chúng chứa.a collection of objects that supports fast first-in, first-out (FIFO) semantics for inserts and deletes. The insert and delete operations sometimes called enqueue and dequeue. Unlike lists or arrays, queues typically don't allow for random access to the objects they contain.

Mục đích của hàng đợi là gì?

Hàng đợi cung cấp các dịch vụ trong nghiên cứu khoa học máy tính, giao thông và vận hành trong đó các thực thể khác nhau như dữ liệu, đối tượng, người hoặc sự kiện được lưu trữ và giữ để xử lý sau đó.Trong các bối cảnh này, hàng đợi thực hiện chức năng của bộ đệm.provide services in computer science, transport, and operations research where various entities such as data, objects, persons, or events are stored and held to be processed later. In these contexts, the queue performs the function of a buffer.

Hàng đợi và dequeue trong Python là gì?

Hàng đợi Python là một thư viện tích hợp cho phép bạn tạo một danh sách sử dụng quy tắc FIFO, đầu tiên trong Out.Python Deque đầu tiên sử dụng quy tắc ngược lại, xếp hàng LIFO hoặc cuối cùng trong lần đầu tiên.Cả hai hoạt động trên ngăn xếp và hàng đợi.Khi bạn làm việc trong Python, bạn có thể muốn tạo một hàng đợi các mục thay vì một danh sách. Python deque uses the opposite rule, LIFO queue, or last in first out. Both operate on stacks and queues. When you're working in Python, you may want to create a queue of items instead of a list .