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 tạo một widget nhập ngày và giờ sử dụng PyQt QDateTimeEdit

Cách tạo một widget nhập ngày và giờ sử dụng PyQt QDateTimeEdit

Cách tạo một widget nhập giờ sử dụng lớp PyQt QTimeEdit

Cách tạo một widget nhập giờ sử dụng lớp PyQt QTimeEdit

Cách tạo một widget nhập ngày sử dụng lớp PyQt QDateEdit

Cách tạo một widget nhập ngày sử dụng lớp PyQt QDateEdit

Cách sử dụng widget PyQt QSpinBox để tạo một spin box

Cách sử dụng widget PyQt QSpinBox để tạo một spin box

Sử dụng PyQt QComboBox để tạo Widget Combobox

Sử dụng PyQt QComboBox để tạo Widget Combobox

Cách sử dụng lớp PyQt QRadioButton

Cách sử dụng lớp PyQt QRadioButton

Cách sử dụng lớp QCheckBox trong PyQt

Cách sử dụng lớp QCheckBox trong PyQt

Cách sử dụng QFormLayout trong PyQt

Cách sử dụng QFormLayout trong PyQt

Cách sử dụng QGridLayout trong PyQt

Cách sử dụng QGridLayout trong PyQt

Cách sử dụng QVBoxLayout trong PyQt

Cách sử dụng QVBoxLayout trong PyQt

Cách sử dụng widget QLineEdit trong PyQt

Cách sử dụng widget QLineEdit trong PyQt

Cách sử dụng widget QPushButton của PyQt

Cách sử dụng widget QPushButton của PyQt

Cách sử dụng widget PyQt QLabel

Cách sử dụng widget PyQt QLabel

Tín hiệu và Khe (Signals & Slots) trong PyQt

Tín hiệu và Khe (Signals & Slots) trong PyQt

PyQt là gì? Tạo một chương trình

PyQt là gì? Tạo một chương trình "Hello World".

Ứng dụng System Tray với Tkinter

Ứng dụng System Tray với Tkinter

Cách hiển thị đồ thị từ thư viện Matplotlib trong Tkinter

Cách hiển thị đồ thị từ thư viện Matplotlib trong Tkinter

Cách sử dụng Validate trong Tkinter

Cách sử dụng Validate trong Tkinter

Cấu trúc MVC trong Tkinter

Cấu trúc MVC trong Tkinter

Cách sử dụng widget PhotoImage của Tkinter

Cách sử dụng widget PhotoImage của Tkinter

Top