PYTHON CONCURRENCY
CÁC CHỦ ĐỀ
BÀI MỚI NHẤT
MỚI CẬP NHẬT

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ể.

test php

banquyen png
Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

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ừ class Thread 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ụng urllib để 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!

Cùng chuyên mục:

Cách thêm Progress Bar trong Python với chỉ một dòng Code

Cách thêm Progress Bar trong Python với chỉ một dòng Code

Toán tử Walrus Operator- Tính năng mới trong Python 3.8

Toán tử Walrus Operator- Tính năng mới trong Python 3.8

Cách nạp dữ liệu Machine Learning từ File trong Python

Cách nạp dữ liệu Machine Learning từ File trong Python

Hướng dẫn sử dụng Google Sheets API với Python

Hướng dẫn sử dụng Google Sheets API với Python

Xây dựng  web Python tự động hóa Twitter | Flask, Heroku, Twitter API & Google Sheets API

Xây dựng web Python tự động hóa Twitter | Flask, Heroku, Twitter API & Google Sheets API

Xây dựng Web Machine Learning đẹp mắt với Streamlit và Scikit-learn trong Python

Xây dựng Web Machine Learning đẹp mắt với Streamlit và Scikit-learn trong Python

Hướng dẫn tạo Chatbot đơn giản bằng PyTorch

Hướng dẫn tạo Chatbot đơn giản bằng PyTorch

11 mẹo và thủ thuật để viết Code Python hiệu quả hơn

11 mẹo và thủ thuật để viết Code Python hiệu quả hơn

Hướng dẫn làm ứng dụng TODO với Flask dành cho người mới bắt đầu trong Python

Hướng dẫn làm ứng dụng TODO với Flask dành cho người mới bắt đầu trong Python

Hướng dẫn viết Snake Game bằng Python

Hướng dẫn viết Snake Game bằng Python

Cách sử dụng chế độ interactive trong Python

Cách sử dụng chế độ interactive trong Python

Cách sử dụng Python Debugger với hàm breakpoint()

Cách sử dụng Python Debugger với hàm breakpoint()

Xây dựng ứng dụng Web Style Transfer với PyTorch và Streamlit

Xây dựng ứng dụng Web Style Transfer với PyTorch và Streamlit

Cách cài đặt Jupyter Notebook trong môi trường Conda và thêm Kernel

Cách cài đặt Jupyter Notebook trong môi trường Conda và thêm Kernel

Hướng dẫn xây dựng ứng dụng dự đoán giá cổ phiếu bằng Python

Hướng dẫn xây dựng ứng dụng dự đoán giá cổ phiếu bằng Python

Hướng dẫn tạo ứng dụng AI hội thoại với NVIDIA Jarvis trong Python

Hướng dẫn tạo ứng dụng AI hội thoại với NVIDIA Jarvis trong Python

Hỗ trợ Async trong Django 3.1

Hỗ trợ Async trong Django 3.1

8 mẹo tái cấu trúc Python giúp mã sạch hơn và Pythonic

8 mẹo tái cấu trúc Python giúp mã sạch hơn và Pythonic

Ý nghĩa của if __name__ ==

Ý nghĩa của if __name__ == "__main__" trong Python

Cách xóa phần tử trong danh sách Python

Cách xóa phần tử trong danh sách Python

Top