Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.
Cách mở rộng Class Thread trong Python
Khi một chương trình khởi động, nó sẽ có một luồng chính để thực thi mã. Tuy nhiên, trong nhiều trường hợp, việc xử lý các tác vụ I/O-bound một cách đồng thời có thể giúp tăng hiệu suất của ứng dụng. Để đạt được điều này, bạn có thể sử dụng module threading
có sẵn trong Python. Một cách tiếp cận phổ biến để thực thi mã trong một luồng mới là mở rộng class Thread
của module threading
. Trong bài viết này, mình sẽ tìm hiểu cách mở rộng class Thread
để chạy mã trong một luồng mới, thông qua các bước đơn giản và ví dụ minh họa cụ thể.
![banquyen png](https://freetuts.net/public/banquyen.png)
Giới thiệu về Class Thread trong Python
Khi một chương trình Python khởi động, nó có một luồng gọi là luồng chính. Đôi khi, bạn muốn chuyển các tác vụ I/O-bound sang một luồng mới để thực hiện chúng đồng thời. Để làm điều đó, bạn sử dụng module threading có sẵn.
Một cách để thực thi mã trong một luồng mới là mở rộng class Thread
của module threading. Dưới đây là các bước:
- Đầu tiên, định nghĩa một class con của class
threading.Thread
. - Thứ hai, ghi đè phương thức
__init__(self, [,args])
bên trong phương thức__init__()
của class con để thêm các đối số tùy chỉnh. - Thứ ba, ghi đè phương thức
run(self, [,args])
bên trong class con để tùy chỉnh hành vi của class luồng mới khi một luồng mới được tạo.
Hãy cùng xem một ví dụ về việc mở rộng class Thread
. Chúng ta sẽ phát triển một class thực hiện yêu cầu HTTP đến một URL và hiển thị mã phản hồi:
Bài viết này được đăng tại [free tuts .net]
from threading import Thread import urllib.request class HttpRequestThread(Thread): def __init__(self, url: str) -> None: super().__init__() self.url = url def run(self) -> None: print(f'Checking {self.url} ...') try: response = urllib.request.urlopen(self.url) print(response.code) except urllib.error.HTTPError as e: print(e.code) except urllib.error.URLError as e: print(e.reason)
Cách thức hoạt động:
-
Đầu tiên, định nghĩa class
HttpRequestThread
mở rộng từ classThread
của module threading.
class HttpRequestThread(Thread):
- Thứ hai, định nghĩa phương thức
__init__()
nhận một URL. Bên trong phương thức__init__()
, gọi phương thức__init__()
của class cha.
def __init__(self, url: str) -> None: super().__init__() self.url = url
- Thứ ba, ghi đè phương thức
run
sử dụngurllib
để lấy mã trạng thái HTTP của URL đã chỉ định và hiển thị nó lên console.
def run(self) -> None: print(f'Checking {self.url} ...') try: response = urllib.request.urlopen(self.url) print(response.code) except urllib.error.HTTPError as e: print(e.code) except urllib.error.URLError as e: print(e.reason)
Để sử dụng class HttpRequestThread
, bạn tạo các đối tượng của class HttpRequestThread
và gọi phương thức start()
. Bạn cũng có thể gọi phương thức join()
để chờ tất cả các luồng hoàn thành.
Dưới đây là cách định nghĩa hàm main()
sử dụng class HttpRequestThread
:
def main() -> None: urls = [ 'https://httpstat.us/200', 'https://httpstat.us/400' ] threads = [HttpRequestThread(url) for url in urls] [t.start() for t in threads] [t.join() for t in threads] if __name__ == '__main__': main()
Cách thức hoạt động:
-
Đầu tiên, định nghĩa một danh sách các URL mà chúng ta muốn kiểm tra:
urls = [ 'https://httpstat.us/200', 'https://httpstat.us/400' ]
Thứ hai, tạo các đối tượng của HttpRequestThread
dựa trên danh sách URL bằng cách sử dụng list comprehension. List comprehension trả về một danh sách các đối tượng của class HttpRequestThread
:
threads = [HttpRequestThread(url) for url in urls]
Thứ ba, gọi phương thức start()
của mỗi luồng trong danh sách threads
:
[t.start() for t in threads]
Cuối cùng, gọi phương thức join()
của mỗi đối tượng Thread
để chờ tất cả các luồng hoàn thành:
[t.join() for t in threads]
Kết quả:
Checking https://httpstat.us/200 ... Checking https://httpstat.us/400 ... 200 400
Kết bài
Trên đây là hướng dẫn cách mở rộng class Thread
trong Python để thực thi mã trong các luồng mới. Việc sử dụng module threading
giúp bạn tận dụng hiệu quả tài nguyên máy tính và tăng khả năng xử lý đồng thời cho các tác vụ I/O-bound. Bằng cách này, bạn có thể cải thiện hiệu suất của ứng dụng một cách đáng kể, đồng thời giảm thiểu thời gian chờ đợi của người dùng khi tương tác với các tác vụ đòi hỏi I/O.
Hy vọng rằng hướng dẫn này đã cung cấp cho bạn kiến thức cần thiết để áp dụng module threading
trong các dự án Python của mình một cách hiệu quả. Hãy áp dụng và thử nghiệm để tận dụng hết tiềm năng của việc sử dụng đa luồng trong lập trình Python!