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:

Hướng dẫn xây dựng Command-Line Interface (CLI) bằng Quo trong Python

Hướng dẫn xây dựng Command-Line Interface (CLI) bằng Quo trong Python

Hướng dẫn toàn diện về module datetime trong Python

Hướng dẫn toàn diện về module datetime trong Python

Cách truy cập và thiết lập biến môi trường trong Python

Cách truy cập và thiết lập biến môi trường trong Python

Lớp dữ liệu (Data Classes) trong Python với decorator @dataclass

Lớp dữ liệu (Data Classes) trong Python với decorator @dataclass

Từ khóa yield trong Python

Từ khóa yield trong Python

Sự khác biệt giữa sort() và sorted() trong Python

Sự khác biệt giữa sort() và sorted() trong Python

Sử dụng Poetry để quản lý dependencies trong Python

Sử dụng Poetry để quản lý dependencies trong Python

Định dạng chuỗi Strings trong Python

Định dạng chuỗi Strings trong Python

Một tác vụ phổ biến khi làm việc với danh sách trong Python

Một tác vụ phổ biến khi làm việc với danh sách trong Python

Làm việc với các biến môi trường trong Python

Làm việc với các biến môi trường trong Python

Sự khác biệt giữa set() và frozenset() trong Python

Sự khác biệt giữa set() và frozenset() trong Python

Sự khác biệt giữa iterator và iterable trong Python

Sự khác biệt giữa iterator và iterable trong Python

Cách làm việc với file tarball/tar trong Python

Cách làm việc với file tarball/tar trong Python

Chuyển đổi kiểu dữ liệu trong Python

Chuyển đổi kiểu dữ liệu trong Python

Sự khác biệt giữa toán tử == và is trong Python

Sự khác biệt giữa toán tử == và is trong Python

Làm việc với file ZIP trong Python

Làm việc với file ZIP trong Python

Cách sử dụng ThreadPoolExecutor trong Python

Cách sử dụng ThreadPoolExecutor trong Python

Sự khác biệt giữa byte objects và string trong Python

Sự khác biệt giữa byte objects và string trong Python

Xử lý độ chính xác các hàm floor, ceil, round, trunc, format  trong Python

Xử lý độ chính xác các hàm floor, ceil, round, trunc, format trong Python

Cách lặp qua nhiều list với hàm zip() trong Python

Cách lặp qua nhiều list với hàm zip() trong Python

Top