Tôi có một dự án cho công việc. Chúng tôi đã viết một mô -đun và ở đó như một #Todo để triển khai luồng để cải thiện mô -đun. Tôi là một lập trình viên Python khá mới và quyết định đánh một cú đánh vào đó. Trong khi học và thực hiện luồng, tôi đã có câu hỏi tương tự như có bao nhiêu chủ đề là quá nhiều? Bởi vì chúng tôi có một hàng đợi khoảng 6 đối tượng cần được xử lý, vậy tại sao lại tạo 6 luồng [hoặc bất kỳ luồng nào] để xử lý các đối tượng trong danh sách hoặc hàng đợi khi thời gian xử lý không đáng kể? [Mỗi đối tượng mất nhiều nhất khoảng 2 giây để xử lý]
Vì vậy, tôi đã chạy một thí nghiệm nhỏ. Tôi muốn biết nếu có mức tăng hiệu suất từ việc sử dụng luồng. Xem mã Python của tôi bên dưới:
import threading
import queue
import math
import time
results_total = []
results_calculation = []
results_threads = []
class MyThread[threading.Thread]:
def __init__[self, thread_id, q]:
threading.Thread.__init__[self]
self.threadID = thread_id
self.q = q
def run[self]:
# print["Starting " + self.name]
process_data[self.q]
# print["Exiting " + self.name]
def process_data[q]:
while not exitFlag:
queueLock.acquire[]
if not workQueue.empty[]:
potentially_prime = True
data = q.get[]
queueLock.release[]
# check if the data is a prime number
# print["Testing {0} for primality.".format[data]]
for i in range[2, int[math.sqrt[data]+1]]:
if data % i == 0:
potentially_prime = False
break
if potentially_prime is True:
prime_numbers.append[data]
else:
queueLock.release[]
for j in [1, 2, 3, 4, 5, 10, 15, 20, 25, 30, 40, 50, 75, 100, 150, 250, 500,
750, 1000, 2500, 5000, 10000]:
threads = []
numberList = list[range[1, 10001]]
queueLock = threading.Lock[]
workQueue = queue.Queue[]
numberThreads = j
prime_numbers = list[]
exitFlag = 0
start_time_total = time.time[]
# Create new threads
for threadID in range[0, numberThreads]:
thread = MyThread[threadID, workQueue]
thread.start[]
threads.append[thread]
# Fill the queue
queueLock.acquire[]
# print["Filling the queue..."]
for number in numberList:
workQueue.put[number]
queueLock.release[]
# print["Queue filled..."]
start_time_calculation = time.time[]
# Wait for queue to empty
while not workQueue.empty[]:
pass
# Notify threads it's time to exit
exitFlag = 1
# Wait for all threads to complete
for t in threads:
t.join[]
# print["Exiting Main Thread"]
# print[prime_numbers]
end_time = time.time[]
results_total.append[
"The test took {0} seconds for {1} threads.".format[
end_time - start_time_total, j]
]
results_calculation.append[
"The calculation took {0} seconds for {1} threads.".format[
end_time - start_time_calculation, j]
]
results_threads.append[
"The thread setup time took {0} seconds for {1} threads.".format[
start_time_calculation - start_time_total, j]
]
for result in results_total:
print[result]
for result in results_calculation:
print[result]
for result in results_threads:
print[result]
Thử nghiệm này tìm thấy các số nguyên tố trong khoảng từ 1 đến 10000. Thiết lập này được lấy khá nhiều từ //www.tutorialspoint.com/python3/python_multithreading.htms nhưng thay vì in một chuỗi đơn giản, tôi hỏi các chủ đề để tìm các số nguyên tố chính để tìm các số nguyên tố chính để tìm các số nguyên tố để tìm các số nguyên tố để tìm số nguyên tố để tìm số nguyên tố để tìm số nguyên tố để tìm . Đây thực sự không phải là ứng dụng trong thế giới thực của tôi nhưng hiện tại tôi không thể kiểm tra mã tôi đã viết cho mô -đun. Tôi nghĩ rằng đây là một thử nghiệm tốt để đo lường hiệu quả của các chủ đề bổ sung. Ứng dụng trong thế giới thực của tôi liên quan đến việc nói chuyện với nhiều thiết bị nối tiếp. Tôi đã chạy bài kiểm tra 5 lần và trung bình thời gian. Dưới đây là kết quả trong một biểu đồ:
Các câu hỏi của tôi liên quan đến luồng và bài kiểm tra này như sau:
Có phải bài kiểm tra này thậm chí là một đại diện tốt về cách sử dụng chủ đề? Đây không phải là một tình huống máy chủ/máy khách. Về hiệu quả, có tốt hơn không để tránh song song khi bạn không phục vụ khách hàng hoặc xử lý các bài tập/công việc được thêm vào hàng đợi?
Nếu câu trả lời cho 1 là "Không, bài kiểm tra này không phải là nơi người ta nên sử dụng các luồng." Sau đó là khi nào? Nói chung.
Nếu câu trả lời cho 1 là "Có, điều này là OK để sử dụng các chủ đề trong trường hợp đó.", Tại sao việc thêm chủ đề cuối cùng mất nhiều thời gian hơn và nhanh chóng đạt đến một cao nguyên? Thay vào đó, tại sao người ta muốn sử dụng các chủ đề vì phải mất nhiều thời gian hơn nhiều lần so với việc tính toán nó trong một vòng lặp.
Tôi nhận thấy rằng khi tỷ lệ công việc trên luồng trở nên gần với 1: 1, thời gian thực hiện để thiết lập các luồng trở nên dài hơn. Vì vậy, việc chỉ có hữu ích khi bạn tạo các chủ đề một lần và giữ cho chúng tồn tại càng lâu càng tốt để xử lý các yêu cầu có thể enqueue nhanh hơn chúng có thể được tính toán?