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:

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