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 dừng Luồng trong Python

Trong lập trình đa luồng, việc kiểm soát và quản lý các luồng là vô cùng quan trọng để đảm bảo chương trình hoạt động một cách hiệu quả và ổn định. Một trong những thách thức phổ biến là làm thế nào để dừng một luồng đang chạy khi không còn cần thiết hoặc khi cần giải phóng tài nguyên. Trong bài viết này, bạn sẽ học cách dừng một luồng trong Python từ luồng chính bằng cách sử dụng lớp Event của mô-đun threading. Chúng ta sẽ đi qua các bước cụ thể và cung cấp các ví dụ minh họa rõ ràng để giúp bạn nắm vững cách thức triển khai phương pháp này trong các tình huống thực tế.

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ề đối tượng Event trong Python

Để dừng một luồng, bạn sử dụng lớp Event của mô-đun threading. Lớp Event có một cờ boolean an toàn cho luồng nội bộ có thể được đặt là True hoặc False. Mặc định, cờ nội bộ này là False.

Trong lớp Event, phương thức set() sẽ đặt cờ nội bộ thành True, trong khi phương thức clear() sẽ đặt lại cờ thành False. Ngoài ra, phương thức is_set() sẽ trả về True nếu cờ nội bộ được đặt thành True.

Để dừng một luồng con từ luồng chính, bạn sử dụng đối tượng Event theo các bước sau:

Bài viết này được đăng tại [free tuts .net]

  • Tạo một đối tượng Event mới và truyền nó vào luồng con.
  • Kiểm tra định kỳ nếu cờ nội bộ của đối tượng Event được đặt trong luồng con bằng cách gọi phương thức is_set() và dừng luồng con nếu cờ nội bộ đã được đặt.
  • Gọi phương thức set() trong luồng chính tại một thời điểm nào đó để dừng luồng con.

Sơ đồ dưới đây minh họa các bước trên:

python stop thread png

Ví dụ đơn giản về việc dừng một luồng trong Python

Ví dụ sau đây sẽ cho thấy cách sử dụng đối tượng Event để dừng một luồng con từ luồng chính:

from threading import Thread, Event
from time import sleep

def task(event: Event) -> None:
    for i in range(6):
        print(f'Running #{i+1}')
        sleep(1)
        if event.is_set():
            print('The thread was stopped prematurely.')
            break
    else:
        print('The thread was stopped maturely.')

def main() -> None:

    event = Event()
    thread = Thread(target=task, args=(event,))
    
    # start the thread
    thread.start()

    # suspend the thread after 3 seconds
    sleep(3)

    # stop the child thread
    event.set()    
   
if __name__ == '__main__':
    main()

Hàm task()

Hàm task() sử dụng đối tượng Event và trả về None. Nó sẽ được thực thi trong luồng con:

def task(event: Event) -> None:
    for i in range(6):
        print(f'Running #{i+1}')
        sleep(1)
        if event.is_set():
            print('The thread was stopped prematurely.')
            break
    else:
        print('The thread was stopped maturely.')

Hàm task() lặp qua các số từ 1 đến 5. Trong mỗi lần lặp, chúng ta sử dụng hàm sleep() để trì hoãn thực thi và thoát khỏi vòng lặp nếu cờ nội bộ của đối tượng Event được đặt.

Hàm main()

Trước tiên, tạo một đối tượng Event mới:

event = Event()

Tiếp theo, tạo một luồng mới để thực thi hàm task() với đối tượng Event làm tham số:

thread = Thread(target=task, args=(event,))

Sau đó, bắt đầu thực thi luồng con:

thread.start()

Tiếp theo, tạm dừng luồng chính trong ba giây:

sleep(3)

Cuối cùng, đặt cờ nội bộ của đối tượng Event thành True bằng cách gọi phương thức set(). Điều này sẽ dừng luồng con:

event.set()

Dừng một luồng sử dụng lớp con của lớp Thread trong Python

Đôi khi, bạn có thể muốn mở rộng lớp Thread và ghi đè phương thức run() để tạo một luồng mới:

class MyThread(Thread):
    def run(self):
        pass

Để dừng luồng sử dụng lớp kế thừa của lớp Thread, bạn cũng sử dụng đối tượng Event của mô-đun threading.

Ví dụ sau đây sẽ cho thấy cách tạo một luồng con sử dụng lớp kế thừa của lớp Thread và sử dụng đối tượng Event để dừng luồng con từ luồng chính khi cần:

from threading import Thread, Event
from time import sleep

class Worker(Thread):
    def __init__(self, event, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.event = event

    def run(self) -> None:
        for i in range(6):
            print(f'Running #{i+1}')
            sleep(1)
            if self.event.is_set():
                print('The thread was stopped prematurely.')
                break
        else:
            print('The thread was stopped maturely.')

def main() -> None:

    # create a new Event object
    event = Event()

    # create a new Worker thread
    thread = Worker(event)
    
    # start the thread
    thread.start()

    # suspend the thread after 3 seconds
    sleep(3)

    # stop the child thread
    event.set()    
   
if __name__ == '__main__':
    main()

Cách hoạt động

Trước tiên, định nghĩa lớp Worker mở rộng từ lớp Thread của mô-đun threading. Phương thức __init__() của lớp Worker chấp nhận một đối tượng Event.

Tiếp theo, ghi đè phương thức run() của lớp Worker và sử dụng đối tượng Event để dừng luồng.

Cuối cùng, định nghĩa hàm main() tạo một đối tượng Event, một luồng Worker, và truyền đối tượng Event vào luồng Worker. Phần logic còn lại tương tự như hàm main() trong ví dụ trước.

Kết bài

Sử dụng đối tượng Event là một phương pháp hiệu quả và an toàn để kiểm soát và dừng các luồng con từ luồng chính trong Python. Bằng cách sử dụng phương thức set() để đặt cờ nội bộ của đối tượng Event thành True và phương thức is_set() để kiểm tra trạng thái của cờ, bạn có thể dễ dàng xác định và quản lý thời điểm dừng các luồng con. Hy vọng rằng qua bài viết này, bạn đã nắm được cách áp dụng lớp Event trong thực tiễn để đảm bảo chương trình của bạn hoạt động mượt mà và đáng tin cậy hơn.

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