Hướng dẫn python multithreading not working - python đa luồng không hoạt động

Tôi dường như không thể làm cho mã đa luồng này hoạt động với tập lệnh Python đã có cấu trúc của tôi của một tập lệnh đóng IP đơn giản với một vài tính năng khác.

Sau khi kiểm tra mã đa luồng tôi mặc dù tôi đã sẵn sàng để thực hiện mã của mình, tuy nhiên tôi dường như không thể gọi một luồng mới một cách chính xác. Tôi biết điều này bởi vì nếu đa luồng hoạt động chính xác, giao diện GUI của tôi sẽ không ngừng phản hồi khi hàm scanall [] được thực thi khi nhấn nút quét tất cả IPS trên giao diện GUI.

Tôi cũng không nhận được lỗi nữa sau khi hoàn thành việc thực hiện, vì vậy bây giờ thật khó để biết phải tiến hành điều gì. Điều này cực kỳ bực bội cảm ơn bạn vì những người giúp đỡ, tôi rất thích giải quyết vấn đề này!

Đây là mã đa luồng:

    class ThreadManager:
    """Multi Threading manager"""
    def __init__[self]:
        pass

    def start[self, threads]:
        thread_refs = []
        for i in range[threads]:
            t = MyThread[i]  # Thread[args=[1,]]  # target=test[],
            t.daemon = True
            print['starting thread %i' % i]
            t.start[]
        for t in thread_refs:
            t.join[]


class MyThread[Thread]:
    """Multi Threading"""
    def __init__[self, i]:
        Thread.__init__[self]
        self.i = i

    def run[self]:
        while True:
            print['thread # {}'.format[self.i]]
            time.sleep[.25]
            break

Và đây là mã thực thi đa luồng:

print["[Debug] Main Thread has been started"]
self.manager = ThreadManager[]
self.manager.start[1]

Đây là GitHub cho toàn bộ mã tập lệnh và triển khai đa luồng.

//github.com/Hontiris1/IPPing

Gil không ngăn chặn luồng. Tất cả các Gil làm là đảm bảo chỉ có một luồng thực thi mã Python tại một thời điểm; Kiểm soát vẫn chuyển đổi giữa các luồng.

Nội phân chính

  • Hiểu lập trình đồng thời so với thực hiện song song
  • Python xây dựng
  • Đa luồng-song song dựa trên chủ đề
  • Đa xử lý-song song dựa trên quy trình
  • Python có hỗ trợ đa luồng thực sự không?
  • Python không phải là đa luồng?
  • Có thể xâu chuỗi trong Python?
  • Tại sao Python không an toàn?

Việc thiếu an toàn luồng có nghĩa là các phương thức/chức năng không có bảo vệ chống lại nhiều luồng tương tác với dữ liệu đó cùng một lúc - chúng không có khóa xung quanh dữ liệu để đảm bảo mọi thứ phù hợp. Các công cụ async không an toàn vì nó không cần phải có.

Gil không ngăn chặn luồng. Tất cả các Gil làm là đảm bảo chỉ có một luồng thực thi mã Python tại một thời điểm; Kiểm soát vẫn chuyển đổi giữa các luồng.

Nội phân chính

Hiểu lập trình đồng thời so với thực hiện song song

Python xây dựng

Đa luồng-song song dựa trên chủ đề

Đa xử lý-song song dựa trên quy trình

Hiểu lập trình đồng thời so với thực hiện song song

Python xây dựng

Đa luồng-song song dựa trên chủ đề

Đa xử lý-song song dựa trên quy trình

Python có hỗ trợ đa luồng thực sự không?

Những gì Gil ngăn chặn sau đó, đang sử dụng nhiều hơn một lõi CPU hoặc CPU riêng biệt để chạy các luồng song song.

Điều này chỉ áp dụng cho mã Python. Các tiện ích mở rộng C có thể và thực hiện việc giải phóng GIL để cho phép nhiều luồng mã C và một luồng python chạy qua nhiều lõi. Điều này mở rộng cho I/O được kiểm soát bởi kernel, chẳng hạn như các cuộc gọi select[] cho các lần đọc và ghi ổ cắm, làm cho Python xử lý các sự kiện mạng hiệu quả một cách hợp lý trong một thiết lập đa lõi đa luồng.

Python xây dựng

Đa luồng-song song dựa trên chủ đề

Đa xử lý-song song dựa trên quy trình

Câu trả lời là Jein [có và không trong tiếng Đức]. Tại sao có? Python có các thư viện tích hợp cho các cấu trúc lập trình đồng thời phổ biến nhất-đa xử lý và đa luồng. Bạn có thể nghĩ, vì Python hỗ trợ cả hai, tại sao Jein? Lý do là, đa luồng trong Python không thực sự là đa luồng, do Gil trong Python.Jein [Yes and No in German]. Why yes? Python does have built-in libraries for the most common concurrent programming constructs — multiprocessing and multithreading. You may think, since Python supports both, why Jein? The reason is, multithreading in Python is not really multithreading, due to the GIL in Python.

Đa luồng-song song dựa trên chủ đề

threading là gói cung cấp API để tạo và quản lý các luồng. Các chủ đề trong Python luôn không xác định và lịch trình của chúng được thực hiện bởi hệ điều hành. Tuy nhiên, đa luồng có thể không làm những gì bạn mong đợi.

Tại sao đa luồng trong Python có thể không phải là những gì bạn & nbsp; muốn?

Khác với những cạm bẫy phổ biến như bế tắc, chết đói trong đa luồng nói chung. Python nổi tiếng với hiệu suất kém trong đa luồng.

Chúng ta hãy nhìn vào đoạn trích sau:

nhập luồng

Def Countdown []: x = 1000000000 trong khi x> 0: x -= 1

# Triển khai 1: Multi-threadingDef Triển khai_1 []: Thread_1 = Threading.Thread [Target = Countdown] Thread_2 = Threading.Thread [Target = Countdown] Thread_1.Start [] Thread_2.start [] ]

# Triển khai 2: Chạy trong Triển khai Serialdef_2 []: Đếm ngược [] Đếm ngược []

Việc thực hiện nào sẽ nhanh hơn? Hãy để chúng tôi thực hiện một thời gian.

Kết quả thời gian của cả hai triển khai

Đáng ngạc nhiên, chạy 2 countdown[] vượt trội so với đa luồng? Làm sao điều này xảy ra được? Nhờ khóa thông dịch viên toàn cầu khét tiếng [GIL].

Thuốc phiên dịch toàn cầu là gì & nbsp; [GIL] là gì?

Phụ thuộc vào sự phân phối của Python của bạn, mà hầu hết các trường hợp, là một triển khai của CPython. CPython là triển khai ban đầu của Python, bạn có thể đọc thêm về nó trong chuỗi StackOverflow này.

Trong Cpython, đa luồng được hỗ trợ bằng cách giới thiệu một mutex được gọi là khóa phiên dịch toàn cầu [còn gọi là Gil]. Đó là để ngăn chặn nhiều luồng truy cập cùng một đối tượng Python cùng một lúc. Điều này có ý nghĩa, bạn sẽ không muốn người khác đột biến đối tượng của bạn trong khi bạn đang xử lý nó.

Minh họa thực hiện_1

Vì vậy, từ đoạn mã của chúng tôi ở trên, implementation_1 tạo ra 2 luồng và được cho là chạy song song trên một hệ thống đa luồng. Tuy nhiên, chỉ có một luồng có thể giữ GIL tại một thời điểm, một luồng phải đợi một luồng khác để giải phóng GIL trước khi chạy. Trong khi đó, lập lịch và chuyển đổi được thực hiện bởi hệ điều hành giới thiệu chi phí làm cho implementation_1 thậm chí chậm hơn.

Làm thế nào để bỏ qua & nbsp; gil?

Làm thế nào chúng ta có thể bỏ qua Gil, trong khi duy trì việc sử dụng đa luồng? Không có câu trả lời tốt cho câu hỏi này, vì điều này thay đổi theo mục đích của mã của bạn.

Sử dụng một triển khai khác của Python như Jython, Pypy hoặc IronPython là một lựa chọn. Cá nhân tôi không ủng hộ việc sử dụng một triển khai Python khác vì hầu hết các thư viện được viết không được kiểm tra chống lại các triển khai khác nhau của Python.

Một cách giải quyết tiềm năng khác là sử dụng C-Extension, hoặc được gọi là Cython. Lưu ý rằng Cython và Cpython không giống nhau. Bạn có thể đọc thêm về Cython ở đây.

Sử dụng đa xử lý thay thế. Kể từ khi đa xử lý, một thông dịch viên được tạo cho mỗi quá trình trẻ em. Tình huống mà các chủ đề đấu tranh cho Gil Simple không tồn tại vì luôn luôn có một chủ đề chính trong mọi quy trình.

Bất chấp tất cả những cạm bẫy, chúng ta vẫn nên sử dụng đa luồng?

Nếu nhiệm vụ của bạn là I/O bị ràng buộc, có nghĩa là luồng dành phần lớn thời gian để xử lý I/O như thực hiện các yêu cầu mạng. Vẫn là hoàn toàn tốt khi sử dụng đa luồng làm chủ đề, hầu hết thời gian, bị chặn và đưa vào hàng đợi bị chặn bởi HĐH. Chủ đề cũng luôn luôn đói tài nguyên hơn quá trình.

Đa xử lý-song song dựa trên quy trình

Hãy để chúng tôi thực hiện đoạn mã trước đây của chúng tôi bằng cách sử dụng đa xử lý.

Nhập đa xử lý

# Countdown [] được định nghĩa trong đoạn trích trước.

DEF THỰC HIỆN_3 []: Process_1 = MultipRocessing.Process [Target = Countdown] Process_2 = Multiprocessing.Process [Target = Countdown] Process_1.start [] Process_2.start []

Kết quả là bản thân là tự giải thích.

Kết quả thời gian của đa bộ xử lý so với đa luồng

Sự kết luận

Hạn chế của Gil là một cái gì đó đã bắt tôi ngay từ đầu thời gian là một nhà phát triển Python. Tôi đã nhận thức được quyết định của tôi về việc sử dụng chủ đề là hoàn toàn vô giá trị cho đến khi tôi thực hiện thời gian. Tôi hy vọng bài viết này sẽ giúp.

Vui lòng nhấp vào nút 👏 nếu bạn thấy điều này hữu ích.

ĐANG TẢI. . . Nhận xét và nhiều hơn nữa!
. . . comments & more!

Python có hỗ trợ đa luồng thực sự không?

Python có các thư viện tích hợp cho các cấu trúc lập trình đồng thời phổ biến nhất-đa xử lý và đa luồng. — multiprocessing and multithreading.

Python không phải là đa luồng?

Python không phải là ngôn ngữ đơn.Các quá trình Python thường sử dụng một luồng duy nhất vì GIL.Mặc dù GiL, các thư viện thực hiện các nhiệm vụ nặng về tính toán như Numpy, Scipy và Pytorch sử dụng các triển khai dựa trên C dưới mui xe, cho phép sử dụng nhiều lõi.. Python processes typically use a single thread because of the GIL. Despite the GIL, libraries that perform computationally heavy tasks like numpy, scipy and pytorch utilise C-based implementations under the hood, allowing the use of multiple cores.

Có thể xâu chuỗi trong Python?

Python Threading cho phép bạn có các phần khác nhau trong chương trình chạy đồng thời và có thể đơn giản hóa thiết kế của bạn.Nếu bạn có một số kinh nghiệm về Python và muốn tăng tốc chương trình của mình bằng các chủ đề, thì hướng dẫn này là dành cho bạn!. If you've got some experience in Python and want to speed up your program using threads, then this tutorial is for you!

Tại sao Python không an toàn?

Việc thiếu an toàn luồng có nghĩa là các phương thức/chức năng không có bảo vệ chống lại nhiều luồng tương tác với dữ liệu đó cùng một lúc - chúng không có khóa xung quanh dữ liệu để đảm bảo mọi thứ phù hợp.Các công cụ async không an toàn vì nó không cần phải có.the methods/functions don't have protection against multiple threads interacting with that data at the same time - they don't have locks around data to ensure things are consistent. The async stuff isn't thread safe because it doesn't need to be.

Bài Viết Liên Quan

Chủ Đề