Hướng dẫn can i thread class in python? - tôi có thể phân luồng lớp trong python không?
Show Trong bài viết này, chúng tôi sẽ thảo luận về cách tạo một chủ đề trong Python bằng cách mở rộng một lớp hoặc bằng cách gọi hàm thành viên của một lớp.
import threading Bây giờ mô -đun luồng Python, cung cấp một lớp luồng để tạo và quản lý các luồng. Chúng ta có thể mở rộng lớp này để tạo một luồng hoặc trực tiếp tạo đối tượng lớp luồng và truyền chức năng thành viên của lớp khác. Hãy cùng xem cả hai kỹ thuật một cách chi tiết, Mở rộng lớp luồng để tạo luồngGiả sử chúng ta có một lớp fileloaderthread, mô phỏng chức năng của trình tải tệp và phương thức Run Run () ngủ trong khoảng 5 giây. & NBSP; Chúng ta có thể tạo lớp này bằng cách mở rộng lớp luồng được cung cấp bởi mô -đun luồng, tức là.FileLoaderThread, which simulates the functionality of a file loader and it’s run() method sleeps for around 5 seconds. We can create this class by
extending Thread class provided by the threading module i.e. # A class that extends the Thread class class FileLoaderThread(Thread): Bây giờ tất cả các chức năng của lớp luồng sẽ được kế thừa cho lớp fileloaderthread của chúng tôi.FileLoaderThread class. Lớp luồng có phương thức chạy () được gọi bất cứ khi nào chúng ta khởi động luồng bằng cách gọi hàm start (). & Nbsp; Ngoài ra, chạy () hàm trong lớp luồng gọi thực thể có thể gọi (ví dụ: hàm) được truyền trong đối số đích để thực thi hàm đó Trong luồng. & nbsp; nhưng trong lớp dẫn xuất của chúng tôi, chúng tôi có thể ghi đè hàm chạy () vào triển khai tùy chỉnh của chúng tôi như thế này, # A class that extends the Thread class class FileLoaderThread(Thread): def __init__(self, fileName, encryptionType): # Call the Thread class's init function Thread.__init__(self) self.fileName = fileName self.encryptionType = encryptionType # Override the run() function of Thread class def run(self): print('Started loading contents from file : ', self.fileName) print('Encryption Type : ', self.encryptionType) for i in range(5): print('Loading ... ') time.sleep(1) print('Finished loading contents from file : ', self.fileName) Trong lớp fileloaderthread của hàm tạo (__init __ ()), chúng tôi đã gọi hàm cơ sở (luồng) __init __ () mà không có bất kỳ đối số nào và lưu trữ các đối số được truyền trong các biến thành viên của nó. & NBSP; Làm một số ngủ và khi hoàn thành trong khoảng 5 giây.FileLoaderThread’s constructor (__init__() ) we have called the base class (Thread) __init__() function without any arguments and stored the passed arguments in it’s member variables. Also, we have overloaded the run() function and that will do some sleeping and when completes in around 5 seconds. Bây giờ khi lớp fileloaderthread của chúng tôi mở rộng lớp luồng có tất cả sức mạnh của nó, vì vậy chúng tôi có thể tạo một luồng bằng cách tạo đối tượng của lớp này, tức là. # Create an object of Thread th = FileLoaderThread('users.csv','ABC') Ngoài ra, chúng ta có thể gọi hàm start () trên đó để khởi động chức năng và tham gia () hàm để chờ nó thoát ra, tức là. # start the thread th.start() # print some logs in main thread for i in range(5): print('Hi from Main Function') time.sleep(1) # wait for thread to finish th.join() Về cơ bản, nó sẽ tạo một luồng mới AMD thực thi hàm Run () của lớp fileloaderthread song song với hàm main (). & Nbsp; do đó đầu ra của mã trên như sau, Started loading contents from file : users.csv Encryption Type : ABC Hi from Main Function Loading ... Loading ... Hi from Main Function Loading ... Hi from Main Function Loading ... Hi from Main Function Hi from Main Function Loading ... Finished loading contents from file : users.csv Hàm chính gọi Jopnow () trên đối tượng lớp fileloaderthread để chờ luồng kết thúc. Vì vậy, tốt hơn là chờ đợi các chủ đề khác kết thúc bằng cách gọi Jop () trên đối tượng của họ trước khi quay lại từ chủ đề chính.FileLoaderThread class object to wait for thread to finish. It’s because when main thread exists application exists without waiting for other threads. So, it better to wait for other threads to finish by calling join() on their object before returning from main thread. Quảng cáo Ví dụ hoàn chỉnh như sau, from threading import Thread import time # A class that extends the Thread class class FileLoaderThread(Thread): def __init__(self, fileName, encryptionType): # Call the Thread class's init function Thread.__init__(self) self.fileName = fileName self.encryptionType = encryptionType # Override the run(0 function of Thread class def run(self): print('Started loading contents from file : ', self.fileName) print('Encryption Type : ', self.encryptionType) for i in range(5): print('Loading ... ') time.sleep(1) print('Finished loading contents from file : ', self.fileName) def main(): # Create an object of Thread th = FileLoaderThread('users.csv','ABC') # start the thread th.start() # print some logs in main thread for i in range(5): print('Hi from Main Function') time.sleep(1) # wait for thread to finish th.join() if __name__ == '__main__': main() Output: Started loading contents from file : users.csv Encryption Type : ABC Hi from Main Function Loading ... Loading ... Hi from Main Function Loading ... Hi from Main Function Loading ... Hi from Main Function Hi from Main Function Loading ... Finished loading contents from file : users.csv Tạo một luồng từ hàm thành viên của một lớpGiả sử chúng ta có trình tải filela lớp, tức là. class FileLoader(): def __init__(self): pass ''' A dummy function that prints some logs and sleeps in a loop/ takes approx 5 seconds to finish. ''' def loadContents(self, fileName, encryptionType): print('Started loading contents from file : ', fileName) print('Encryption Type : ', encryptionType) for i in range(5): print('Loading ... ') time.sleep(1) print('Finished loading contents from file : ', fileName) Bây giờ chúng tôi muốn tạo một chủ đề thực thi hàm thành viên LoadContents () của lớp này. Trước hết, tạo một đối tượng của lớp này và sau đó chuyển chức năng thành viên cùng với đối tượng sang đối số đích của lớp luồng & nbsp; hàm tạo trong khi tạo đối tượng, tức là. # Create an object of class FileLoader fileLoader = FileLoader() # Create a thread using member function of class FileLoader th = threading.Thread(target=fileLoader.loadContents, args=('users.csv','ABC', )) Bây giờ cả hàm Main () và LoadContents () Hàm thành viên của lớp fileloader sẽ chạy song song. & Nbsp; Vì vậy, đầu ra của mã trên là Started loading contents from file : users.csv Encryption Type : ABC Hi from Main Function Loading ... Loading ... Hi from Main Function Loading ... Hi from Main Function Loading ... Hi from Main Function Hi from Main Function Loading ... Finished loading contents from file : users.csv Cả chủ đề chính và luồng mới của chúng tôi sẽ chạy song song và cuối luồng chính sẽ đợi chủ đề khác kết thúc bằng cách gọi hàm nối () trên đối tượng của nó. Ví dụ hoàn chỉnh như sau, # A class that extends the Thread class class FileLoaderThread(Thread):1 Tạo một luồng từ hàm thành viên của một lớp # A class that extends the Thread class class FileLoaderThread(Thread):2 Giả sử chúng ta có trình tải filela lớp, tức là. Python có cho phép xâu chuỗi không?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!
Làm thế nào để bạn luồn một lớp con?Làm thế nào để sử dụng một chủ đề trong một lớp con.. Xác định một lớp con mới của lớp chủ đề .. Ghi đè phương thức _init __ (self [, args]) để thêm các đối số bổ sung .. Sau đó, bạn cần ghi đè phương thức chạy (tự [, args]) để thực hiện những gì chủ đề nên làm khi nó được bắt đầu .. Là chủ đề phương thức lớpViệc một phương thức có an toàn hay không phụ thuộc vào những gì phương thức làm.Làm việc với các biến cục bộ chỉ là chủ đề an toàn.Nhưng khi bạn thay đổi cùng một biến không cục bộ từ các luồng khác nhau, nó sẽ trở nên không an toàn.Working with local variables only is thread safe. But when you change the same non local variable from different threads, it becomes unsafe. |