python apscheduler — пропущено: достигнуто максимальное количество запущенных экземпляров

Я выполняю функцию каждую секунду, используя Python apscheduler (версия 3.0.1)

код:

scheduler = BackgroundScheduler()
scheduler.add_job(runsync, 'interval', seconds=1)
scheduler.start()

Большую часть времени он работает нормально, но иногда я получаю это предупреждение:

WARNING:apscheduler.scheduler:Execution of job "runsync (trigger: interval[0:00:01], next run at: 2015-12-01 11:50:42 UTC)" skipped: maximum number of running instances reached (1)

1. Это правильный способ выполнения этого метода?

2.Что означает это предупреждение? Это как-то влияет на выполнение задач внутри функции?

3.как с этим справиться?


person boyfromnorth    schedule 01.12.2015    source источник


Ответы (5)


Это означает, что задача выполняется дольше одной секунды и по умолчанию для данной задачи разрешено только одно параллельное выполнение. Я не могу сказать вам, как справиться с этим, не зная, о чем задача.

person Alex Grönholm    schedule 02.12.2015
comment
Привет, Алекс, Задача проверяет папку в папке FTP, и если папка найдена, она начинает извлекать данные из этих папок, что может занять до 24 часов. - person boyfromnorth; 03.12.2015
comment
Поскольку этот процесс занимает больше секунды, вы будете часто видеть эти предупреждения. При этом вам не нужно ничего с этим делать. - person Alex Grönholm; 04.12.2015

Увеличить max_instances

Если это позволяет конкретный вариант использования, просто увеличьте max_instances, как показано ниже.

import apscheduler.schedulers.blocking

scheduler = apscheduler.schedulers.blocking.BackgroundScheduler('apscheduler.job_defaults.max_instances': '2')

Существует три apscheduler стиля настройки. Они описаны в документации.

person Serge Stroobandt    schedule 14.12.2017

Если вы хотите одновременно запускать экземпляры одного и того же задания и избежать предупреждения, вы можете включить аргумент max_instances в метод планировщика add_job(). Значение по умолчанию — один.

person Jorge Luis    schedule 13.07.2017

Я почти уверен, что моя задача не занимает больше интервала. Я просто последовал этому ответу вместо этого и переключился на apscheduler==2.1.2, как было предложено здесь.

person Semih Sezer    schedule 12.12.2018

Для плавного выполнения вы также можете попробовать 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