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ế.
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ứcis_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:
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.