Hướng dẫn when to use python threads - khi nào sử dụng chuỗi python

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ừ https://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 đồ:

Hướng dẫn when to use python threads - khi nào sử dụng chuỗi python

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:

  1. 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?

  2. 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.

  3. 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?

Khi nào tôi nên sử dụng chủ đề?

Chủ đề rất hữu ích trong lập trình hiện đại bất cứ khi nào một quy trình có nhiều nhiệm vụ để thực hiện độc lập với các quy trình khác.Điều này đặc biệt đúng khi một trong các nhiệm vụ có thể chặn và mong muốn cho phép các nhiệm vụ khác tiến hành mà không chặn.whenever a process has multiple tasks to perform independently of the others. This is particularly true when one of the tasks may block, and it is desired to allow the other tasks to proceed without blocking.

Khi nào bạn không nên sử dụng chủ đề?

Một lý do để không sử dụng đa luồng là: có một nhiệm vụ và không có giao diện người dùng nào mà tác vụ sẽ can thiệp.There is one task, and no user interface with which the task will interfere.

Tôi nên sử dụng bao nhiêu chủ đề?

Nói chung, Python chỉ sử dụng một luồng để thực thi tập hợp các câu lệnh bằng văn bản.Điều này có nghĩa là trong Python, chỉ có một luồng sẽ được thực thi tại một thời điểm.one thread to execute the set of written statements. This means that in python only one thread will be executed at a time.

Có phải luồng trong Python tốt không?

Để tóm tắt lại, luồng trong Python cho phép nhiều luồng được tạo trong một quy trình duy nhất, nhưng do Gil, không ai trong số chúng sẽ chạy cùng một lúc.Chủ đề vẫn là một lựa chọn rất tốt khi chạy nhiều tác vụ ràng buộc I/O đồng thời.Threading is still a very good option when it comes to running multiple I/O bound tasks concurrently.