Hướng dẫn can you thread a class python? - bạn có thể xâu chuỗi một lớp python không?

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.


Python cung cấp một mô -đun luồng để quản lý các luồng. Để sử dụng mà chúng ta cần nhập mô -đun này, tức là.

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ồng

Giả 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ớp

Giả 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à.
In above examples both main thread and our new thread are running in parallel and print messages on the console in parallel. Therefore order of outputs may vary from above outputs because console is a shared resource used by 2 threads in parallel. In future articles we will discuss how to synchronize a single resource between threads.

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ớp

Việ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.

Chúng ta có thể sử dụng đa luồng trong Python không?

MultiThreading trong Python cho phép CPU chạy các phần khác nhau (chủ đề) của một quá trình đồng thời để tối đa hóa việc sử dụng CPU.MultiThreading cho phép CPU chạy đồng thời các phần (luồng) của một quá trình.. Multithreading enables CPUs to run different parts(threads) of a process concurrently.

Có phải luồng thực sự trong Python?

MultiThreading trong Python là một huyền thoại.Về mặt kỹ thuật, không có gì cấm nhiều chủ đề cố gắng truy cập cùng một tài nguyên cùng một lúc.Kết quả thường không được mong muốn, vì vậy những thứ như khóa, mutexes và người quản lý tài nguyên đã được phát triển.. There's technically nothing forbidding multiple threads from trying to access the same resource at the same time. The result is usually not desirable, so things like locks, mutexes, and resource managers were developed.