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 mở rộng Class Thread trong Python

Khi một chương trình khởi động, nó sẽ có một luồng chính để thực thi mã. Tuy nhiên, trong nhiều trường hợp, việc xử lý các tác vụ I/O-bound một cách đồng thời có thể giúp tăng hiệu suất của ứng dụng. Để đạt được điều này, bạn có thể sử dụng module threading có sẵn trong Python. Một cách tiếp cận phổ biến để thực thi mã trong một luồng mới là mở rộng class Thread của module threading. Trong bài viết này, mình sẽ tìm hiểu cách mở rộng class Thread để chạy mã trong một luồng mới, thông qua các bước đơn giản và ví dụ minh họa cụ thể.

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 về Class Thread trong Python

Khi một chương trình Python khởi động, nó có một luồng gọi là luồng chính. Đôi khi, bạn muốn chuyển các tác vụ I/O-bound sang một luồng mới để thực hiện chúng đồng thời. Để làm điều đó, bạn sử dụng module threading có sẵn.

Một cách để thực thi mã trong một luồng mới là mở rộng class Thread của module threading. Dưới đây là các bước:

  • Đầu tiên, định nghĩa một class con của class threading.Thread.
  • Thứ hai, ghi đè phương thức __init__(self, [,args]) bên trong phương thức __init__() của class con để thêm các đối số tùy chỉnh.
  • Thứ ba, ghi đè phương thức run(self, [,args]) bên trong class con để tùy chỉnh hành vi của class luồng mới khi một luồng mới được tạo.

Hãy cùng xem một ví dụ về việc mở rộng class Thread. Chúng ta sẽ phát triển một class thực hiện yêu cầu HTTP đến một URL và hiển thị mã phản hồi:

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

    def run(self) -> None:
        print(f'Checking {self.url} ...')
        try:
            response = urllib.request.urlopen(self.url)
            print(response.code)
        except urllib.error.HTTPError as e:
            print(e.code)
        except urllib.error.URLError as e:
            print(e.reason)

Cách thức hoạt động:

  • Đầu tiên, định nghĩa class HttpRequestThread mở rộng từ class Thread của module threading.

class HttpRequestThread(Thread):
  • Thứ hai, định nghĩa phương thức __init__() nhận một URL. Bên trong phương thức __init__(), gọi phương thức __init__() của class cha.
def __init__(self, url: str) -> None:
    super().__init__()
    self.url = url
  • Thứ ba, ghi đè phương thức run sử dụng urllib để lấy mã trạng thái HTTP của URL đã chỉ định và hiển thị nó lên console.
def run(self) -> None:
    print(f'Checking {self.url} ...')
    try:
        response = urllib.request.urlopen(self.url)
        print(response.code)
    except urllib.error.HTTPError as e:
        print(e.code)
    except urllib.error.URLError as e:
        print(e.reason)

Để sử dụng class HttpRequestThread, bạn tạo các đối tượng của class HttpRequestThread và gọi phương thức start(). Bạn cũng có thể gọi phương thức join() để chờ tất cả các luồng hoàn thành.

Dưới đây là cách định nghĩa hàm main() sử dụng class HttpRequestThread:

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

    threads = [HttpRequestThread(url) for url in urls]

    [t.start() for t in threads]

    [t.join() for t in threads]

if __name__ == '__main__':
    main()

Cách thức hoạt động:

  • Đầu tiên, định nghĩa một danh sách các URL mà chúng ta muốn kiểm tra:

urls = [
    'https://httpstat.us/200',
    'https://httpstat.us/400'
]

Thứ hai, tạo các đối tượng của HttpRequestThread dựa trên danh sách URL bằng cách sử dụng list comprehension. List comprehension trả về một danh sách các đối tượng của class HttpRequestThread:

threads = [HttpRequestThread(url) for url in urls]

Thứ ba, gọi phương thức start() của mỗi luồng trong danh sách threads:

[t.start() for t in threads]

Cuối cùng, gọi phương thức join() của mỗi đối tượng Thread để chờ tất cả các luồng hoàn thành:

[t.join() for t in threads]

Kết quả:

Checking https://httpstat.us/200 ...
Checking https://httpstat.us/400 ...
200
400

Kết bài

Trên đây là hướng dẫn cách mở rộng class Thread trong Python để thực thi mã trong các luồng mới. Việc sử dụng module threading giúp bạn tận dụng hiệu quả tài nguyên máy tính và tăng khả năng xử lý đồng thời cho các tác vụ I/O-bound. Bằng cách này, bạn có thể cải thiện hiệu suất của ứng dụng một cách đáng kể, đồng thời giảm thiểu thời gian chờ đợi của người dùng khi tương tác với các tác vụ đòi hỏi I/O.

Hy vọng rằng hướng dẫn này đã cung cấp cho bạn kiến thức cần thiết để áp dụng module threading trong các dự án Python của mình một cách hiệu quả. Hãy áp dụng và thử nghiệm để tận dụng hết tiềm năng của việc sử dụng đa luồng trong lập trình Python!

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