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