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

Cách triển khai hàng đợi Đa luồng với Python

Giới thiệu ..

Trong ví dụ này, chúng tôi sẽ tạo một hàng đợi tác vụ chứa tất cả các tác vụ sẽ được thực thi và một nhóm luồng tương tác với hàng đợi để xử lý các phần tử của nó một cách riêng lẻ.

Chúng ta sẽ bắt đầu với câu hỏi, Hàng đợi là gì ?. Hàng đợi là một cấu trúc dữ liệu là một tập hợp các phần tử khác nhau được duy trì theo một thứ tự rất cụ thể. Hãy để tôi giải thích bằng cách lấy một ví dụ thực tế.

Giả sử bạn đứng xếp hàng để thanh toán hóa đơn hàng tạp hóa tại quầy bán hàng tạp hóa, (đừng hỏi tôi cửa hàng tạp hóa nào)

Trong một dòng người đang chờ thanh toán hóa đơn của họ, bạn sẽ nhận thấy những điều sau:

1. Mọi người vào ở một đầu của dòng và thoát ra từ đầu kia.

2. Nếu người A vào hàng trước người B thì người A sẽ rời hàng trước người B (trừ khi người B là người nổi tiếng hoặc được ưu tiên hơn).

3. Khi mọi người đã thanh toán hóa đơn của họ, sẽ không còn ai trong hàng.

Chà, quay lại lập trình trong đó hàng đợi hoạt động theo kiểu tương tự.

1. enqueue - Các phần tử được thêm vào cuối hàng đợi.

2. dequeue - Các phần tử bị xóa khỏi đầu hàng đợi.

Còn nữa, First In First Out (FIFO) - các phần tử được thêm vào trước sẽ bị xóa trước. Last In First Out (LIFO) - phần tử cuối cùng được thêm vào sẽ bị xóa trước.

Python triển khai cấu trúc dữ liệu Hàng đợi như thế nào?

Mô-đun hàng đợi trong Python cung cấp một triển khai đơn giản của cấu trúc dữ liệu hàng đợi. Mỗi hàng đợi có thể có các phương thức sau.

  • get ():trả về phần tử tiếp theo.

  • put ():thêm một phần tử mới.

  • qsize ():số phần tử hiện tại trong hàng đợi.

  • void ():trả về Boolean, cho biết hàng đợi có trống hay không.

  • full ():trả về Boolean, cho biết hàng đợi đã đầy chưa.

1.Chúng ta sẽ tạo một hàm nhận đối số x sau đó lặp qua các số từ 1 đến chính nó (x), để thực hiện phép nhân. Ví dụ khi bạn chuyển 5 cho hàm này, nó sẽ lặp lại từ 1 đến 5 và tiếp tục nhân lên, tức là 1 lần 5, 2 lần 5, 3 lần 5, 4 lần 5, 5 lần 5 cuối cùng trả về các giá trị dưới dạng danh sách.

Ví dụ

def print_multiply(x):
output_value = []
for i in range(1, x + 1):
output_value.append(i * x)
print(f"Output \n *** The multiplication result for the {x} is - {output_value}")
print_multiply(5)

Đầu ra

*** The multiplication result for the 5 is - [5, 10, 15, 20, 25]

2.Chúng ta sẽ viết một hàm khác gọi là process_queue (), hàm này sẽ cố gắng lấy phần tử tiếp theo của đối tượng hàng đợi. Tôi sẽ sử dụng chế độ ngủ để trì hoãn việc tiếp tục một chút.

Ví dụ

def process_queue():
while True:
try:
value = my_queue.get(block=False)
except queue.Empty:
return
else:
print_multiply(value)
time.sleep(2)

3.Tạo một lớp, khi một thể hiện mới được khởi tạo và bắt đầu, hàm process_queue () sẽ được gọi.

Ví dụ

class MultiThread(threading.Thread):
def __init__(self, name):
threading.Thread.__init__(self)
self.name = name

def run(self):
print(f" ** Starting the thread - {self.name}")
process_queue()
print(f" ** Completed the thread - {self.name}")

Cuối cùng, chúng ta sẽ chuyển danh sách đầu vào của các số và điền vào hàng đợi.

# setting up variables
input_values = [5, 10, 15, 20]

# fill the queue
my_queue = queue.Queue()
for x in input_values:
my_queue.put(x)

5. Cuối cùng, kết hợp tất cả lại với nhau.

import queue
import threading
import time

# Class
class MultiThread(threading.Thread):
def __init__(self, name):
threading.Thread.__init__(self)
self.name = name

def run(self):
print(f"Output \n ** Starting the thread - {self.name}")
process_queue()
print(f" ** Completed the thread - {self.name}")

# Process thr queue
def process_queue():
while True:
try:
value = my_queue.get(block=False)
except queue.Empty:
return
else:
print_multiply(value)
time.sleep(2)

# function to multiply
def print_multiply(x):
output_value = []
for i in range(1, x + 1):
output_value.append(i * x)
print(f" \n *** The multiplication result for the {x} is - {output_value}")

# Input variables
input_values = [2, 4, 6, 5,10,3]

# fill the queue
my_queue = queue.Queue()
for x in input_values:
my_queue.put(x)
# initializing and starting 3 threads
thread1 = MultiThread('First')
thread2 = MultiThread('Second')
thread3 = MultiThread('Third')
thread4 = MultiThread('Fourth')

# Start the threads
thread1.start()
thread2.start()
thread3.start()
thread4.start()

# Join the threads
thread1.join()
thread2.join()
thread3.join()
thread4.join()

Đầu ra

** Starting the thread - First
*** The multiplication result for the 2 is - [2, 4]

Đầu ra

** Starting the thread - Second
*** The multiplication result for the 4 is - [4, 8, 12, 16]

Đầu ra

** Starting the thread - Third
*** The multiplication result for the 6 is - [6, 12, 18, 24, 30, 36]

Đầu ra

** Starting the thread - Fourth
*** The multiplication result for the 5 is - [5, 10, 15, 20, 25]
*** The multiplication result for the 10 is - [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
*** The multiplication result for the 3 is - [3, 6, 9] ** Completed the thread - Third
** Completed the thread - Fourth
** Completed the thread - Second ** Completed the thread - First

6.Chúng tôi đã triển khai thành công khái niệm hàng đợi. Thấy chưa, chúng ta có 4 luồng nhưng có 6 giá trị cần xử lý, vì vậy ai đến trước Hàng đợi sẽ được thực thi và những người khác sẽ xếp hàng để chờ người khác hoàn thành.

Điều này tương tự như trong cuộc sống thực, giả sử có 3 quầy nhưng 10 người đang đợi thanh toán hóa đơn của họ, vậy 10 người sẽ xếp thành 3 hàng và ai đã thanh toán xong sẽ rời khỏi hàng và nhường chỗ cho người tiếp theo.