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 thêm Progress Bar trong Python với chỉ một dòng Code

Cách thêm Progress Bar trong Python với chỉ một dòng Code

Toán tử Walrus Operator- Tính năng mới trong Python 3.8

Toán tử Walrus Operator- Tính năng mới trong Python 3.8

Cách nạp dữ liệu Machine Learning từ File trong Python

Cách nạp dữ liệu Machine Learning từ File trong Python

Hướng dẫn sử dụng Google Sheets API với Python

Hướng dẫn sử dụng Google Sheets API với Python

Xây dựng  web Python tự động hóa Twitter | Flask, Heroku, Twitter API & Google Sheets API

Xây dựng web Python tự động hóa Twitter | Flask, Heroku, Twitter API & Google Sheets API

Xây dựng Web Machine Learning đẹp mắt với Streamlit và Scikit-learn trong Python

Xây dựng Web Machine Learning đẹp mắt với Streamlit và Scikit-learn trong Python

Hướng dẫn tạo Chatbot đơn giản bằng PyTorch

Hướng dẫn tạo Chatbot đơn giản bằng PyTorch

11 mẹo và thủ thuật để viết Code Python hiệu quả hơn

11 mẹo và thủ thuật để viết Code Python hiệu quả hơn

Hướng dẫn làm ứng dụng TODO với Flask dành cho người mới bắt đầu trong Python

Hướng dẫn làm ứng dụng TODO với Flask dành cho người mới bắt đầu trong Python

Hướng dẫn viết Snake Game bằng Python

Hướng dẫn viết Snake Game bằng Python

Cách sử dụng chế độ interactive trong Python

Cách sử dụng chế độ interactive trong Python

Cách sử dụng Python Debugger với hàm breakpoint()

Cách sử dụng Python Debugger với hàm breakpoint()

Xây dựng ứng dụng Web Style Transfer với PyTorch và Streamlit

Xây dựng ứng dụng Web Style Transfer với PyTorch và Streamlit

Cách cài đặt Jupyter Notebook trong môi trường Conda và thêm Kernel

Cách cài đặt Jupyter Notebook trong môi trường Conda và thêm Kernel

Hướng dẫn xây dựng ứng dụng dự đoán giá cổ phiếu bằng Python

Hướng dẫn xây dựng ứng dụng dự đoán giá cổ phiếu bằng Python

Hướng dẫn tạo ứng dụng AI hội thoại với NVIDIA Jarvis trong Python

Hướng dẫn tạo ứng dụng AI hội thoại với NVIDIA Jarvis trong Python

Hỗ trợ Async trong Django 3.1

Hỗ trợ Async trong Django 3.1

8 mẹo tái cấu trúc Python giúp mã sạch hơn và Pythonic

8 mẹo tái cấu trúc Python giúp mã sạch hơn và Pythonic

Ý nghĩa của if __name__ ==

Ý nghĩa của if __name__ == "__main__" trong Python

Cách xóa phần tử trong danh sách Python

Cách xóa phần tử trong danh sách Python

Top