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
Eventmớ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.

Các kiểu dữ liệu trong C ( int - float - double - char ...)
Thuật toán tìm ước chung lớn nhất trong C/C++
Cấu trúc lệnh switch case trong C++ (có bài tập thực hành)
ComboBox - ListBox trong lập trình C# winforms
Random trong Python: Tạo số random ngẫu nhiên
Lệnh cin và cout trong C++
Cách khai báo biến trong PHP, các loại biến thường gặp
Download và cài đặt Vertrigo Server
Thẻ li trong HTML
Thẻ article trong HTML5
Cấu trúc HTML5: Cách tạo template HTML5 đầu tiên
Cách dùng thẻ img trong HTML và các thuộc tính của img
Thẻ a trong HTML và các thuộc tính của thẻ a thường dùng