Hướng dẫn when should you use threads in python? - khi nào bạn nên sử dụng chủ đề trong 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 . Đâ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 should you use threads in python? - khi nào bạn nên sử dụng chủ đề trong 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 luồng hoặc đa xử lý?

Đa bộ xử lý là một điều dễ dàng hơn để giảm so với ren nhưng có chi phí bộ nhớ cao hơn.Nếu mã của bạn bị ràng buộc CPU, đa xử lý rất có thể sẽ là lựa chọn tốt hơn, đặc biệt là nếu máy đích có nhiều lõi hoặc CPU.. If your code is CPU bound, multiprocessing is most likely going to be the better choice—especially if the target machine has multiple cores or CPUs.

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

Python không an toàn cho luồng và ban đầu được thiết kế với một thứ gọi là Gil, hoặc khóa thông dịch toàn cầu, đảm bảo các quy trình được thực thi theo chiều cao trên CPU của máy tính.Nhìn bề ngoài, điều này có nghĩa là các chương trình Python không thể hỗ trợ đa xử lý., and was originally designed with something called the GIL, or Global Interpreter Lock, that ensures processes are executed serially on a computer's CPU. On the surface, this means Python programs cannot support multiprocessing.