Computer >> Máy Tính >  >> Lập trình >> Python

Ngăn xếp và Hàng đợi trong Python bằng cách sử dụng Mô-đun hàng đợi

Trong Python, rất dễ dàng thực hiện các cấu trúc dữ liệu ngăn xếp và hàng đợi. Stack được gọi là LIFO vì Stack hoạt động theo nguyên tắc "Last-in, first-out" và Queue được gọi là FIFO vì Queue hoạt động theo nguyên tắc "Nhập trước, xuất trước" và các hàm có sẵn trong Python làm cho mã ngắn hơn và đơn giản.

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 và Nó đặc biệt hữu ích trong lập trình phân 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 Hàng đợi trong mô-đun này triển khai tất cả các ngữ nghĩa khóa được yêu cầu và nó phụ thuộc vào tính khả dụng của hỗ trợ luồng trong Python.

Mô-đun này thực hiện ba loại hàng đợi, chỉ khác nhau về thứ tự mà các mục được truy xuất. Đối với hàng đợi FIFO, các tác vụ đầu tiên được thêm vào là lần truy xuất đầu tiên và đối với hàng đợi LIFO, mục nhập được thêm gần đây nhất là mục nhập đầu tiên được truy xuất (hoạt động giống như một ngăn xếp). Và đối với hàng đợi ưu tiên, các mục nhập được sắp xếp (sử dụng mô-đun heapq) và mục nhập có giá trị thấp nhất sẽ được truy xuất trước.

Mô-đun hàng đợi này xác định các lớp và ngoại lệ sau.

class Queue.Queue (maxsize =0)

Đây là một phương thức khởi tạo cho hàng đợi FIFO. Đối số maxsize là một số nguyên đặt giới hạn trên về số lượng mục có thể được đặt trong hàng đợi. Chèn sẽ chặn khi đạt đến kích thước này, cho đến khi các mục trong hàng đợi được tiêu thụ. Nếu kích thước tối đa nhỏ hơn hoặc bằng 0 thì kích thước hàng đợi sẽ là vô hạn.

class Queue.LifoQueue (maxsize =0)

Đây là hàm tạo cho hàng đợi LIFO. Đối số maxsize là một số nguyên đặt giới hạn trên về số lượng mục có thể được đặt trong hàng đợi. Chèn sẽ chặn khi đạt đến kích thước này, cho đến khi các mục trong hàng đợi được tiêu thụ. Nếu kích thước tối đa nhỏ hơn hoặc bằng 0 thì kích thước hàng đợi sẽ là vô hạn.

class Queue.PhesiaQueue (maxsize =0)

Đây là hàm tạo cho một hàng đợi ưu tiên. Đối số maxsize là một số nguyên đặt giới hạn trên về số lượng mục có thể được đặt trong hàng đợi. Chèn sẽ chặn khi đạt đến kích thước này, cho đến khi các mục trong hàng đợi được tiêu thụ. Nếu kích thước tối đa nhỏ hơn hoặc bằng 0 thì kích thước hàng đợi là vô hạn.

Hàng đợi ngoại lệ.Empty

Dòng này cho biết rằng ngoại lệ được đưa ra khi get () (hoặc get_nowait ()) không chặn được gọi trên một đối tượng Queue trống.

Hàng đợi ngoại lệ. Toàn bộ

Dòng này cho biết rằng ngoại lệ được đưa ra khi không chặn put () (hoặc put_nowait ()) được gọi trên một đối tượng Hàng đợi đã đầy.

Đối tượng hàng đợi

Queue.qsize ()

Hàm này trả về kích thước gần đúng của hàng đợi.

Queue.empty ()

Hàm này trả về True nếu hàng đợi trống, ngược lại là False. Nếu rỗng () trả về giá trị True, nó không đảm bảo rằng lệnh gọi put () tiếp theo sẽ không bị chặn. Tương tự, nếu void () trả về False, nó không đảm bảo rằng một lệnh gọi get () tiếp theo sẽ không bị chặn.

Queue.full ()

Trả về True nếu hàng đợi đầy, trả về False nếu không. Nếu full () trả về True, nó không đảm bảo rằng một lệnh gọi get () tiếp theo sẽ không bị chặn. Tương tự, nếu full () trả về False, nó không đảm bảo rằng lệnh gọi put () tiếp theo sẽ không bị chặn.

Queue.put (item [, block [, timeout]])

Đặt mục vào hàng đợi. Nếu khối args tùy chọn là true và thời gian chờ là Không (mặc định), hãy chặn nếu cần thiết cho đến khi có sẵn vùng trống. Nếu thời gian chờ là một số dương, nó sẽ chặn tối đa số giây thời gian chờ và tăng Ngoại lệ hoàn toàn nếu không có vùng trống nào trong thời gian đó. Nếu không (khối là false), hãy đặt một mục vào hàng đợi nếu một vị trí trống ngay lập tức có sẵn, nếu không, hãy nâng Ngoại lệ hoàn toàn (thời gian chờ được bỏ qua trong trường hợp đó).

Queue.get ([block [, timeout]])

Loại bỏ và trả lại một mục từ hàng đợi. Nếu khối args tùy chọn là true và thời gian chờ là Không (mặc định), hãy chặn nếu cần cho đến khi có một mục. Nếu thời gian chờ là một số dương, nó sẽ chặn tối đa số giây thời gian chờ và tăng ngoại lệ Rỗng nếu không có mục nào có sẵn trong thời gian đó. Ngược lại (khối là false), hãy trả lại một mục nếu một mục có sẵn ngay lập tức, nếu không, hãy nâng ngoại lệ Empty (thời gian chờ được bỏ qua trong trường hợp đó).

Queue.task_done ()

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

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

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

Queue.join ()

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

Số lượng nhiệm vụ 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ố lượng giảm xuống bất cứ khi nào một chuỗi người tiêu dùng gọi task_done () để chỉ ra rằng mục đã được truy xuất và tất cả công việc trên nó đã hoàn tất. Khi số lượng nhiệm vụ chưa hoàn thành giảm xuống 0, hãy bỏ chặn join ().

Mã mẫu

import queue
#maximum capacity of queue is 20
Q = queue.Queue(maxsize=40)
Q.put(50)
Q.put(90)
Q.put(10)
Q.put(70)
print(Q.get())
print(Q.get())
print(Q.get())
print(Q.get())

Đầu ra

50
90
10
70

Ví dụ về Dòng chảy tràn / Dòng chảy tràn

import queue
Q = queue.Queue(maxsize=30)
print(Q.qsize())
Q.put(50)
Q.put(90)
Q.put(10)
Q.put(70)
print("Full: ", Q.full())
Q.put(90)
Q.put(100)
print("Full: ", Q.full())
print(Q.get())
print(Q.get())
print(Q.get())
print("Empty: ", Q.empty())
print(Q.get())
print(Q.get())
print(Q.get())
print("Empty: ", Q.empty())
print("Full: ", Q.full())

Đầu ra

0
Full: False
Full: False
50
90
10
Empty: False
70
90
100
Empty: True
Full: False

Ví dụ 3 về Ngăn xếp

import queue
S = queue.LifoQueue(maxsize=10)
# qsize() give the maxsize of
# the Queue
print(S.qsize())
S.put(50)
S.put(90)
S.put(10)
S.put(70)
S.put(90)
S.put(10)
print("Full: ", S.full())
print("Size: ", S.qsize())
# Data will be accessed in the
# reverse order Reverse of that
# of Queue
print(S.get())
print(S.get())
print(S.get())
print(S.get())
print(S.get())
print("Empty: ", S.empty())

Đầu ra

0
Full: False
Size: 6
10
90
70
10
90
Empty: False