کلاس Timer
با استفاده از این کلاس میتوان ترد ها را به نحوی تعریف کرد که با تاخیر اجرا شوند.
from threading import Timer
def say_hi(name):
print('hi', name)
Timer(3, say_hi, args=('mmreza', )).start()در تکه کد بالا، تابع say_hi پس از ۳ ثانیه اجرا خواهد شد.
برای لغو اجرا، میتوانید قبل از اجرا از متد cancel استفاده کنید. در غیر اینصورت متوقف نمیشود. به مثال زیر توجه کنید.
from threading import Timer
def say_hi(name):
print('hi', name)
say_hi_after_3_seconds = Timer(3, say_hi, args=('mmreza', ))
say_hi_after_3_seconds.start()
say_hi_after_3_seconds.cancel()موارد استفاده
برخی از کاربرد های Timer به شرح زیر است:
- اجرای وظایف به تأخیر افتاده
- گاهی اوقات نیاز دارید تا یک عملیات را بعد از گذشت مدت زمانی مشخص اجرا کنید. مثلاً ارسال یادآوری بعد از مدت زمان معین یا انجام عملیات پاکسازی حافظه.
- زمانبندی وظایف دورهای
- گرچه
Timerبرای وظایف تکباره طراحی شده است، میتوان از آن برای زمانبندی وظایف دورهای نیز استفاده کرد. با اجرای دوباره تایمر در انتهای تابع، میتوانید یک عملکرد تکراری ایجاد کنید.
- گرچه
- ارسال اعلانها و یادآوریها
- میتوانید از تایمر برای ارسال اعلانها و یادآوریها پس از مدت زمان مشخصی استفاده کنید. مثلاً یادآوری به کاربر برای انجام یک کار خاص بعد از گذشت مدت زمان معین.
- انجام عملیات با تاخیر در شبکه
- در برخی پروتکلهای شبکه نیاز است تا پس از مدت زمان مشخصی، عملیاتی انجام شود. مثلاً در پروتکلهای timeout یا retry.
- مدیریت زمانبندی در بازیها
- در بازیها، تایمرها میتوانند برای انجام عملیات خاصی مانند ایجاد یک رویداد، تولید یک دشمن جدید، یا افزایش امتیاز بازیکن پس از مدت زمان معین استفاده شوند.
- کنترل رباتها و دستگاههای اتوماسیون
- در سیستمهای کنترل صنعتی یا رباتیک، تایمرها میتوانند برای زمانبندی دقیق اجرای عملیات و توالیهای کاری مورد استفاده قرار گیرند.
مثالهای کاربردی
ارسال یادآوری به کاربر
import threading
def send_reminder():
print("It's time to take a break!")
# ارسال یادآوری بعد از 3600 ثانیه (1 ساعت)
reminder_timer = threading.Timer(3600, send_reminder)
reminder_timer.start()زمانبندی پاکسازی موقت حافظه
import threading
def cleanup_cache():
print("Cleaning up cache...")
# پاکسازی حافظه موقت بعد از 600 ثانیه (10 دقیقه)
cache_cleanup_timer = threading.Timer(600, cleanup_cache)
cache_cleanup_timer.start()اطلاع رسانی به کاربر
import time
from threading import Thread, Timer
def task(name):
print(f'task {name} started')
time.sleep(5)
print(f'task {name} finished')
def check_thread_status(thread):
if thread.is_alive():
print(f"{thread.name} is still running! please wait ...")
t1 = Thread(target=task, args=(1, ))
timer = Timer(3, check_thread_status, args=(t1, ))
t1.start()
timer.start()در هر یک از این مثالها، Timer به شما این امکان را میدهد که عملیات خاصی را بعد از مدت زمان مشخصی اجرا کنید، بدون اینکه نیاز به حلقههای پیچیده یا مدیریت دستی زمان داشته باشید.
مقایسه Timer با sleep
به دلیل شباهت های Timer و sleep گاهی ممکن است هنگام استفاده از آنها دچار سردرگمی شوید. اینجا باید دقت داشته باشید که Timer برای اجرای یک ترد با تاخیر به کار میرود ولی sleep برای ایجاد یک وقفه هنگام اجرای یک ترد استفاده میشود.
اجرای تردی که با Timer به تاخیر افتاده را قبل از اجرا شدنش میتوان لغو کرد اما اجرای تردی که در آن برای ایجاد وقفه از sleep استفاده شده را نمیتوان به راحتی لغو کرد.