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 trả về giá trị từ một Thread trong Python

Trong bài viết này, bạn sẽ học cách trả về giá trị từ một Thread con sang Thread chính bằng cách mở rộng lớp threading.Thread trong Python. Việc chuyển các tác vụ I/O sang các Thread mới để thực thi đồng thời không chỉ giúp tối ưu hóa hiệu suất mà còn giúp chương trình của bạn trở nên linh hoạt hơn. Hướng dẫn này sẽ cung cấp cho bạn các bước cụ thể và ví dụ minh họa rõ ràng để bạn có thể dễ dàng áp dụng trong các dự án của mình.

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 cách trả về giá trị từ một Thread trong Python

Khi một chương trình Python khởi động, nó có một Thread chính. Đôi khi, bạn muốn chuyển các tác vụ I/O sang các Thread mới để thực thi chúng đồng thời. Ngoài ra, bạn có thể muốn nhận lại giá trị từ các Thread này trong Thread chính.

Để trả về một giá trị từ một Thread , bạn có thể mở rộng lớp Thread và lưu trữ giá trị đó trong một instance của lớp này.

Dưới đây là ví dụ minh họa cách kiểm tra một URL cụ thể và trả về mã trạng thái HTTP trong một Thread riêng biệt:

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
        self.http_status_code = None
        self.reason = None

    def run(self) -> None:
        try:
            response = urllib.request.urlopen(self.url)
            self.http_status_code = response.code
        except urllib.error.HTTPError as e:
            self.http_status_code = e.code
        except urllib.error.URLError as e:
            self.reason = e.reason

def main() -> None:
    urls = [
        'https://httpstat.us/200',
        'https://httpstat.us/400'
    ]

    # Tạo các Thread mới
    threads = [HttpRequestThread(url) for url in urls]

    # Khởi động các Thread 
    [t.start() for t in threads]

    # Chờ các Thread hoàn thành
    [t.join() for t in threads]

    # Hiển thị URL với mã trạng thái HTTP
    [print(f'{t.url}: {t.http_status_code}') for t in threads]

if __name__ == '__main__':
    main()

Cách hoạt động:

Đầu tiên, định nghĩa lớp HttpRequestThread mở rộng từ lớp Thread:

class HttpRequestThread(Thread):
    # ...

Tiếp theo, định nghĩa phương thức __init__() để nhận một URL. Bên trong phương thức __init__() khởi tạo các biến instance url, http_status_code, và reason. Biến http_status_code sẽ lưu trữ mã trạng thái của URL tại thời điểm kiểm tra và reason sẽ lưu trữ thông báo lỗi nếu có lỗi xảy ra:

def __init__(self, url: str) -> None:
    super().__init__()
    self.url = url
    self.http_status_code = None
    self.reason = None

Tiếp đó, ghi đè phương thức run() để sử dụng thư viện urllib lấy mã trạng thái HTTP của URL đã chỉ định và gán nó cho trường http_status_code. Nếu có lỗi xảy ra, nó sẽ gán thông báo lỗi cho trường reason:

def run(self) -> None:
    try:
        response = urllib.request.urlopen(self.url)
        self.http_status_code = response.code
    except urllib.error.HTTPError as e:
        self.http_status_code = e.code
    except urllib.error.URLError as e:
        self.reason = e.reason

Sau đó, bạn có thể truy cập url, http_status_code, và reason từ instance của lớp HttpRequestThread.

Cuối cùng, định nghĩa hàm main() để tạo các instance của lớp HttpRequestThread, khởi động các Thread , chờ chúng hoàn thành và lấy kết quả từ các instance:

def main() -> None:
    urls = [
        'https://httpstat.us/200',
        'https://httpstat.us/400'
    ]

    # Tạo các Thread mới
    threads = [HttpRequestThread(url) for url in urls]

    # Khởi động các Thread 
    [t.start() for t in threads]

    # Chờ các Thread hoàn thành
    [t.join() for t in threads]

    # Hiển thị URL với mã trạng thái HTTP
    [print(f'{t.url}: {t.http_status_code}') for t in threads]

Kết bài

Việc mở rộng lớp threading.Thread trong Python không chỉ giúp bạn thực hiện các tác vụ đồng thời mà còn cho phép bạn trả về giá trị từ các Thread con về Thread chính một cách hiệu quả. Qua ví dụ minh họa, chúng ta đã thấy cách tạo và khởi động các Thread mới, xử lý các tác vụ trong luồng con, và thu thập kết quả từ các Thread đó. Hi vọng rằng, hướng dẫn này đã cung cấp cho bạn những kiến thức cần thiết để áp dụng kỹ thuật này vào các dự án thực tế, giúp nâng cao hiệu suất và tính linh hoạt của chương trình.

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