آموزش پایتون - متوقف کردن Thread

متوقف کردن یک ترد (Thread) در پایتون، یکی از نیازهای رایج در برنامه‌نویسی چندتردی است که در آن، اجرای یک ترد باید تحت شرایط خاصی خاتمه یابد. در یک برنامه چندتردی، ممکن است نیاز باشد تا کاری که در یک ترد جدید در حال انجام است، متوقف شود. این موضوع می‌تواند دلایل زیادی داشته باشد؛ از جمله − اتمام کار، خاموش شدن برنامه یا سایر شرایط خارجی.

در پایتون، متوقف کردن تردها را می‌توان با استفاده از threading.Event یا تنظیم یک پرچم (flag) پایان در خود ترد انجام داد. این روش‌ها به شما امکان می‌دهند تردها را به‌طور مؤثر متوقف کنید و اطمینان حاصل کنید که منابع به‌درستی آزاد می‌شوند و تردها به شکلی تمیز خارج می‌شوند.

متوقف کردن ترد با استفاده از شیء Event

یکی از روش‌های ساده برای متوقف کردن یک ترد، استفاده از کلاس threading.Event است. این کلاس به یک ترد اجازه می‌دهد به ترد دیگر سیگنال بدهد که رویداد خاصی رخ داده است. در ادامه نحوه پیاده‌سازی متوقف کردن ترد با استفاده از threading.Event آمده است

مثال

در این مثال، یک کلاس به نام MyThread داریم. شیء آن شروع به اجرای متد run() می‌کند. ترد اصلی برای مدت زمان مشخصی به خواب (sleep) می‌رود و سپس یک رویداد را تنظیم (set) می‌کند. تا زمانی که رویداد شناسایی نشود، حلقه در متد run() ادامه می‌یابد. به محض شناسایی رویداد، حلقه خاتمه می‌یابد.

from time import sleep
from threading import Thread
from threading import Event

class MyThread(Thread):
   def __init__(self, event):
      super(MyThread, self).__init__()
      self.event = event

   def run(self):
      i=0
      while True:
         i+=1
         print ('Child thread running...',i)
         sleep(0.5)
         if self.event.is_set():
            break
         print()
      print('Child Thread Interrupted')

event = Event()
thread1 = MyThread(event)
thread1.start()

sleep(3)
print('Main thread stopping child thread')
event.set()
thread1.join()

هنگامی که این کد را اجرا می‌کنید، خروجی زیر را تولید می‌کند −

Child thread running... 1
Child thread running... 2
Child thread running... 3
Child thread running... 4
Child thread running... 5
Child thread running... 6
Main thread stopping child thread
Child Thread Interrupted

متوقف کردن ترد با استفاده از یک پرچم (Flag)

روش دیگری برای متوقف کردن تردها، استفاده از یک پرچم (Flag) است که ترد در فواصل زمانی منظم آن را بررسی می‌کند. این روش شامل تنظیم یک ویژگی پرچم در شیء ترد و بررسی منظم مقدار آن در حلقه اجرای ترد است.

مثال

این مثال نحوه استفاده از یک پرچم برای کنترل و متوقف کردن یک ترد در حال اجرا را در یک برنامه چندتردی پایتون نشان می‌دهد.

import threading
import time

def foo():
    t = threading.current_thread()
    while getattr(t, "do_run", True):
        print("working on a task")
        time.sleep(1)
    print("Stopping the Thread after some time.")

# Create a thread
t = threading.Thread(target=foo)
t.start()

# Allow the thread to run for 5 seconds
time.sleep(5)

# Set the termination flag to stop the thread
t.do_run = False

هنگامی که این کد را اجرا می‌کنید، خروجی زیر را تولید می‌کند −

working on a task
working on a task
working on a task
working on a task
working on a task
Stopping the Thread after some time.

پیشرفت مطالعه: وضعیت خوانده‌شدن این درس فقط در همین مرورگر ذخیره می‌شود؛ بدون نیاز به حساب کاربری.