Для плавного выполнения вы также можете попробовать simple-scheduler. Почему?
- работает, даже если период ‹ время выполнения
- использует облегченную многопроцессорную обработку
- работает как для событийных, так и для рекурсивных функций
- может запланировать любое количество заданий одновременно и при этом не пропустить ни одно из них.
- по умолчанию работает в фоновом режиме (поэтому легко интегрируется, так как не требуется отдельный код, например, flask)
- та же самая функция может быть запланирована снова с другим job_name
- в случае сбоя выполнения вы можете самостоятельно установить количество повторных попыток
- продолжительность между каждой попыткой также находится под вашим контролем
Пример планировщика событий:
from time import sleep, ctime, time
from simple_scheduler.event import event_scheduler
event_scheduler.timezones()
TZ = "Asia/Kolkata"
WHEN = ["mon|09:**", "*|10:45"] #[mon/tue/wed/thu/fri/sat/sun] or "*" for all days
# correct argument precedence in a function
def print_args(a, b=1, *args, **kwargs):
print(ctime(time()), a, b, args, kwargs)
# the above print_args function would be called twice,
# so to differentiate between then use "job_name"
event_scheduler.add_job(target = print_args,
args = (0,), # don't forget "," for single arguments
kwargs = {"b":2},
when = WHEN,
tz = TZ,
job_name = "print-args-1")
event_scheduler.add_job(target= print_args,
args = (0, 2, "arg1", "arg2"),
kwargs = {"key1":"value1",
"key2":"value2"},
when = WHEN,
tz = TZ,
job_name = "print-args-2")
event_scheduler.verbose = True # (default)
event_scheduler.job_summary()
event_scheduler.run()
event_scheduler.job_summary()
sleep(200)
event_scheduler.remove_job("print-args-2")
sleep(5)
event_scheduler.clear()
Пример повторяющегося планировщика:
from time import sleep, ctime, time
from simple_scheduler.recurring import recurring_scheduler
def wait_10_secs(t):
wait_t_secs(10)
def wait_t_secs(t):
began_at = ctime(time())
sleep(t)
print(f"I waited {t} seconds. [From: {began_at} to {ctime(time())}]")
# the above wait_t_secs function would be called twice,
# so to differentiate between then use "job_name"
recurring_scheduler.add_job(target=wait_10_secs,
period_in_seconds=5, # period < execution time
job_name="ten",
kwargs={"t":10})
recurring_scheduler.add_job(target=wait_t_secs,
kwargs={"t":7}, # period < execution time
period_in_seconds=5,
job_name="seven")
recurring_scheduler.add_job(target=wait_t_secs,
kwargs={"t":3}, # period > execution time
period_in_seconds=5,
job_name="three")
recurring_scheduler.verbose = True # (default)
recurring_scheduler.job_summary()
recurring_scheduler.run()
recurring_scheduler.job_summary()
sleep(10)
print("Removing job with name 'ten'...")
recurring_scheduler.remove_job("ten")
sleep(10)
print("Removing job with name 'ten'...")
recurring_scheduler.remove_job("ten")
sleep(10)
print("Stopping and clearing the scheduler.\n")
recurring_scheduler.clear()
person
Tanveer
schedule
24.06.2021