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

Làm thế nào để triển khai hàng đợi ưu tiên trong Python?

Giới thiệu ...

Mô-đun hàng đợi cung cấp cấu trúc dữ liệu nhập trước, xuất trước (FIFO), nhập sau, xuất trước (LIFO) phù hợp với lập trình đa luồng. Hàng đợi có thể được sử dụng để chuyển dữ liệu hoặc bất kỳ phạm vi thông tin rộng rãi nào, ví dụ:chi tiết phiên, đường dẫn, biến, .. giữa chủ đề người tạo và người tiêu dùng một cách an toàn. Người gọi thường xử lý khóa.

Lưu ý :Cuộc thảo luận này giả định rằng bạn đã hiểu bản chất chung của hàng đợi. Nếu không, bạn có thể đọc một số tài liệu tham khảo trước khi tiếp tục.

1. Hãy để chúng tôi triển khai Hàng đợi FIFO cơ bản.

import queue
fifo = queue.Queue()

# put numbers into queue
for i in range(5):
fifo.put(i)

# if not empty get the numbers from queue
print(f"Ouput \n")
while not fifo.empty():
print(f" {fifo.get()} ")

Đầu ra

0
1
2
3
4

2. Ví dụ trên sử dụng một chuỗi đơn để hiển thị cách các phần tử được xóa khỏi hàng đợi theo cùng thứ tự mà chúng được chèn vào.

3. Hãy để chúng tôi triển khai Hàng đợi LIFO cơ bản.

import queue
lifo = queue.LifoQueue()

# put numbers into queue
for i in range(5):
lifo.put(i)

print(f"Ouput \n")
# if not empty get the numbers from queue
while not lifo.empty():
print(f" {lifo.get()} ")

Đầu ra

4
3
2
1
0

4. Ví dụ trên cho thấy rằng phần gần đây nhất được đưa vào hàng đợi sẽ bị loại bỏ bởi get.

5. Cuối cùng, chúng ta sẽ xem cách triển khai hàng đợi ưu tiên.

Đôi khi thứ tự xử lý của các mục trong hàng đợi cần phải dựa trên mức độ ưu tiên của các mục đó, thay vì chỉ thứ tự chúng được tạo hoặc thêm vào hàng đợi. Ví dụ:một công việc quan trọng của doanh nghiệp đang chạy trong producton yêu cầu CPU và quyền ưu tiên cao nhất so với một công việc in thứ gì đó mà nhà phát triển muốn in. PriorityQueue sử dụng thứ tự sắp xếp của nội dung của hàng đợi để quyết định mục nào cần truy xuất.

import queue
import threading

# Class to get the priority and description and validate the priority
class Job:
def __init__(self, priority, description):
self.priority = priority
self.description = description
print('New job:', description)
return

def __eq__(self, other):
try:
return self.priority == other.priority
except AttributeError:
return NotImplemented

def __lt__(self, other):
try:
return self.priority < other.priority
except AttributeError:
return NotImplemented

# create a priority queue and define the priority
q = queue.PriorityQueue()
q.put(Job(90, 'Developer-Print job'))
q.put(Job(2, 'Business-Report job'))
q.put(Job(1, 'Business-Critical Job'))

# process the job
def process_job(q):
while True:
next_job = q.get()
print(f" *** Now, Processing the job - {next_job.description}")
q.task_done()

# define the threads
workers = [
threading.Thread(target=process_job, args=(q,)),
threading.Thread(target=process_job, args=(q,)), ]

# call the threads and join them.
for w in workers:
w.setDaemon(True)
w.start()

q.join()

Đầu ra

job: Developer-Print job
New job: Business-Report job
New job: Business-Critical Job

Đầu ra

*** Now, Processing the job - Business-Critical Job
*** Now, Processing the job - Business-Report job
*** Now, Processing the job - Developer-Print job

6. Ví dụ này có nhiều luồng sử dụng các công việc, được xử lý dựa trên mức độ ưu tiên của các mục trong hàng đợi tại thời điểm get () được gọi. Thứ tự xử lý dựa trên chỉ số kinh doanh bất kể họ đã được thêm vào thứ tự nào.