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.

Các kiểu dữ liệu trong C ( int - float - double - char ...)
Thuật toán tìm ước chung lớn nhất trong C/C++
Cấu trúc lệnh switch case trong C++ (có bài tập thực hành)
ComboBox - ListBox trong lập trình C# winforms
Random trong Python: Tạo số random ngẫu nhiên
Lệnh cin và cout trong C++
Cách khai báo biến trong PHP, các loại biến thường gặp
Download và cài đặt Vertrigo Server
Thẻ li trong HTML
Thẻ article trong HTML5
Cấu trúc HTML5: Cách tạo template HTML5 đầu tiên
Cách dùng thẻ img trong HTML và các thuộc tính của img
Thẻ a trong HTML và các thuộc tính của thẻ a thường dùng