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:

Hướng dẫn xây dựng Command-Line Interface (CLI) bằng Quo trong Python

Hướng dẫn xây dựng Command-Line Interface (CLI) bằng Quo trong Python

Hướng dẫn toàn diện về module datetime trong Python

Hướng dẫn toàn diện về module datetime trong Python

Cách truy cập và thiết lập biến môi trường trong Python

Cách truy cập và thiết lập biến môi trường trong Python

Lớp dữ liệu (Data Classes) trong Python với decorator @dataclass

Lớp dữ liệu (Data Classes) trong Python với decorator @dataclass

Từ khóa yield trong Python

Từ khóa yield trong Python

Sự khác biệt giữa sort() và sorted() trong Python

Sự khác biệt giữa sort() và sorted() trong Python

Sử dụng Poetry để quản lý dependencies trong Python

Sử dụng Poetry để quản lý dependencies trong Python

Định dạng chuỗi Strings trong Python

Định dạng chuỗi Strings trong Python

Một tác vụ phổ biến khi làm việc với danh sách trong Python

Một tác vụ phổ biến khi làm việc với danh sách trong Python

Làm việc với các biến môi trường trong Python

Làm việc với các biến môi trường trong Python

Sự khác biệt giữa set() và frozenset() trong Python

Sự khác biệt giữa set() và frozenset() trong Python

Sự khác biệt giữa iterator và iterable trong Python

Sự khác biệt giữa iterator và iterable trong Python

Cách làm việc với file tarball/tar trong Python

Cách làm việc với file tarball/tar trong Python

Chuyển đổi kiểu dữ liệu trong Python

Chuyển đổi kiểu dữ liệu trong Python

Sự khác biệt giữa toán tử == và is trong Python

Sự khác biệt giữa toán tử == và is trong Python

Làm việc với file ZIP trong Python

Làm việc với file ZIP trong Python

Cách sử dụng ThreadPoolExecutor trong Python

Cách sử dụng ThreadPoolExecutor trong Python

Sự khác biệt giữa byte objects và string trong Python

Sự khác biệt giữa byte objects và string trong Python

Xử lý độ chính xác các hàm floor, ceil, round, trunc, format  trong Python

Xử lý độ chính xác các hàm floor, ceil, round, trunc, format trong Python

Cách lặp qua nhiều list với hàm zip() trong Python

Cách lặp qua nhiều list với hàm zip() trong Python

Top