schedule¶
Python job scheduling for humans. Run Python functions (or any other callable) periodically using a friendly syntax.
- A simple to use API for scheduling jobs, made for humans.
- In-process scheduler for periodic jobs. No extra processes needed!
- Very lightweight and no external dependencies.
- Excellent test coverage.
- Tested on Python 3.7, 3.8, 3.9, 3.10 and 3.11
Example ¶
When not to use Schedule¶
Let’s be honest, Schedule is not a ‘one size fits all’ scheduling library. This library is designed to be a simple solution for simple scheduling problems. You should probably look somewhere else if you need:
- Job persistence (remember schedule between restarts)
- Exact timing (sub-second precision execution)
- Concurrent execution (multiple threads)
- Localization (workdays or holidays)
Schedule does not account for the time it takes for the job function to execute. To guarantee a stable execution schedule you need to move long-running jobs off the main-thread (where the scheduler runs). See Parallel execution for a sample implementation.
Read More¶
Issues¶
If you encounter any problems, please file an issue along with a detailed description. Please also use the search feature in the issue tracker beforehand to avoid creating duplicates. Thank you
About Schedule¶
Inspired by Adam Wiggins’ article “Rethinking Cron” and the clockwork Ruby module.
Distributed under the MIT license. See LICENSE.txt for more information.
Thanks to all the wonderful folks who have contributed to schedule over the years:
Start a Function at Given Time
How can I run a function in Python, at a given time?
and it will run the function func at 2012-07-17 15:50:00.
I tried the sched.scheduler, but it didn’t start my function.
![]()
9 Answers 9
Going from that we need to work out a delay (in seconds).
Then use datetime.strptime to parse ‘2012-07-17 15:50:00’ (I’ll leave the format string to you)
You can then use delay to pass into a threading.Timer instance, eg:
![]()
16ms. It'll likely not be better than that.
Take a look at the Advanced Python Scheduler, APScheduler: http://packages.python.org/APScheduler/index.html
Might be worth installing this library: https://pypi.python.org/pypi/schedule, basically helps do everything you just described. Here’s an example:
![]()
Here’s an update to stephenbez’ answer for version 3.5 of APScheduler using Python 2.7:
7 способов выполнения запланированных заданий с помощью Python

Планирование заданий — это распространенная проблема программирования, которую в какой-то момент должны решать большинство организаций и разработчиков, чтобы решить критические проблемы. Это еще больше усугубляется распространением больших данных и моделей обучения для машинного обучения.
Возможность обрабатывать петабайты данных на предсказуемой и автоматизированной основе для получения аналитических сведений является ключевым фактором, который выделит вас среди конкурентов.
Существуют различные решения с открытым исходным кодом, такие как Hadoop и Apache-Spark, и собственные решения поставщиков, такие как AWS Glue, которые используются для обработки этих больших наборов данных. Одним из ключевых компонентов, который требуется для всех этих технологий, является «планировщик заданий», который дает возможность запускать события в заранее определенные интервалы времени отказоустойчивым и масштабируемым образом.
Запланированные задания — это автоматизированные части работы, которые могут выполняться в определенное время или на повторяющейся основе, которые преимущественно работают с выражениями стиля Unix, называемыми cron. Это основанные на времени триггеры событий, которые позволяют приложениям планировать выполнение работы на определенную дату или время на основе выражений cron.
Многим приложениям необходимо планировать рутинные задачи, такие как обслуживание системы, администрирование, ежедневное резервное копирование данных или отправка электронной почты. Если ваш код часто используется, всегда будет необходимость запускать какое-то событие или задачу в заранее определенный период времени. Запланированное задание может быть синхронным или асинхронным, охватывая любой произвольный период времени. Инфраструктура, на которой он был запланирован, может полностью отличаться от той, на которой он работает.
Цель этого сообщения в блоге — описать инновационные возможности, которые доступны вам при создании следующего планировщика заданий на Python. После этого вы можете сразу же приступить к автоматизации своих решений для Python и обработки данных.
Предварительные требования
Чтобы продолжить, убедитесь, что у вас установлен Python ≥ 3.5 со средой Anaconda или настроена виртуальная среда python, чтобы вы могли запустить некоторые примеры кодов, чтобы увидеть, как работают некоторые библиотеки.
№1. APScheduler
Это, вероятно, один из самых простых способов добавить планировщик, похожий на cron, в свои веб-приложения или автономные приложения Python. С этой библиотекой довольно легко начать работу, она предлагает несколько бэкэндов, также известных как хранилища вакансий, таких как:
Идея бэкэндов состоит в том, чтобы предоставить место хранения, где вы можете сохранять свои триггеры. Например, если вы настроили скрипт python на выполнение каждый день в 17:00, вы создали триггер. Если вы завершили работу своей программы или неожиданно завершили свою работу — после возобновления работы сценария эти данные можно будет считать из вашего хранилища постоянства и продолжить запуск сценария python в соответствии с настроенным расписанием. Хранилища триггеров также имеют смысл в ситуациях, когда вы не хотите жестко кодировать триггеры или использовать циклы повторного развертывания. Они дают возможность динамически изменять такие триггеры через бэкэнд или предлагают пользователям изменять триггеры через пользовательский интерфейс. Ваш выбор бэкэндов полностью зависит от вашего стека.
APScheduler предлагает три основные системы планирования, которые должны удовлетворить большинство ваших потребностей планировщика заданий:
- Планирование в стиле Cron (с дополнительным временем начала / окончания)
- Выполнение на основе интервалов (запускает задания с равными интервалами, с необязательным временем начала / окончания)
- Одноразовое отложенное выполнение (запускает задания один раз в установленную дату / время)
Ниже приведен пример кода, который выполняет вашу функцию python каждые три часа.
Тот же код можно изменить для использования декораторов
Для получения более подробной информации о том, как использовать библиотеку, вы можете обратиться к lib docs.
№2. CronTab
Cron — это утилита, которая позволяет нам планировать задачи в системах на основе Unix, используя выражения Cron. Задачи в cron определены в crontab, который представляет собой текстовый файл, содержащий команды, которые необходимо выполнить. Синтаксис, используемый в crontab, описан ниже в этой статье.
Python представляет нам модуль crontab для управления запланированными заданиями через cron. Доступные в нем функции позволяют получить доступ к cron, создавать задания, устанавливать ограничения, удалять задания и многое другое без необходимости вручную писать файлы crontab. В этой статье мы покажем, как использовать эти операции в вашем коде Python.
Cron использует особый синтаксис для определения расписания. Он состоит из пяти полей, разделенных пробелами. Поля:

- * * * * * обозначает каждую минуту каждого часа каждого дня месяца.
- 0 15 1,10,23 * * указывает cron запускать задачу в 17:00 (это 17-й час) 1-го, 10-го и 23-го числа каждого месяца.
Если бы вы делали это вручную через терминал, вам нужно было бы ввести следующую команду, чтобы открыть редактор vim по умолчанию:
На этом этапе вы можете настроить новую запись cron, как показано на изображении выше. Давайте посмотрим, как этого добиться с помощью Python.
Инициализируйте новый файл crontab, как показано ниже:
Создайте новую задачу, выполнив следующую команду:
Собрав все части вместе, вы получите следующий скрипт на Python:
В приведенном выше коде мы сначала получили доступ к cron через имя пользователя, а затем создали задание, состоящее из запуска скрипта Python с именем your_python_script.py. Кроме того, мы поставили задачу запускаться каждые 2 минуты. Функция write () добавляет вашу работу в Crontab. Чтобы добавить больше запланированных заданий cron, вы можете впоследствии зарегистрировать больше задач в crontab.
Мы можем настроить crontab для выполнения вашего скрипта python каждый раз, когда ваш сервер или компьютер загружается с дополнительным вызовом функции every_reboot ()
Все задания cron, включая отключенные, могут быть перечислены с помощью следующего кода:
Модуль crontab Python предоставляет нам удобный инструмент для программного управления записями cron, доступными для Unix-подобных систем. Использование интерфейса Python делает жизнь проще, чем создание crontab вручную. С библиотекой crontab python вы можете сделать гораздо больше. Более подробную информацию вы можете прочитать в документации по API.
№3. Вакансии AWS Cron
Если AWS является вашей основной средой разработки и вас не волнует блокировка поставщика, в вашем распоряжении есть несколько вариантов, позволяющих заставить ваш код Python работать в стиле cron.
События CloudWatch с Lambda
Это стандартный подход AWS для создания триггеров cron. Подход использует AWS Lambda, который запускается триггером события cron Cloudwatch. Поскольку здесь используется лямбда, ваш код Python привязан к ограничению лямбда.
Запланированные задачи ECS
Amazon Elastic Container Service (Amazon ECS) — это полностью управляемая служба оркестровки контейнеров. Если вы решите использовать этот подход — вам должно быть комфортно пользоваться докером. Идея построения задач расписания ECS аналогична использованию лямбда-выражения, но лямбда-выражение используется только для запуска выполнения определения задачи ECS, которое соответствует образу докера, на котором размещен ваш код Python. События CloudWatch по-прежнему используются в качестве триггера cron.
События CloudWatch с Lambda и EC2
Если вы возьмете концепции триггеров событий CloudWatch и объедините их с экземплярами лямбда-выражения и EC2, вы получите этот подход. Этот подход может иметь смысл, когда вам нужен ваш код Python для выполнения большего, возможно, для выполнения какой-либо задачи с интенсивным использованием ЦП, которая требует больше ресурсов, но не требует преимуществ бессерверной версии.
AWS Batch
Этот вариант включает более сложные задачи, которые выходят за рамки ограничений бессерверного режима, или задачи, выполнение которых может занять часы или дни. Пакет AWS управляет планированием и подготовкой работы. Вы можете определить многоступенчатые конвейеры, в которых каждый этап зависит от завершения предыдущего. Пакет AWS работает в очереди и инициализирует инстансы EC2 по мере необходимости. Преимущества этого подхода в том, что вы платите только за то, что используете, а управление экземплярами делается за вас.
№4. Периодические задачи с сельдереем
Celery — это среда Python, которая позволяет выполнять распределенную обработку задач в асинхронном режиме с помощью брокеров сообщений, таких как RabbitMQ, SQS и Redis. Celery был построен на основе шаблона проектирования очереди FIFO потребитель-производитель. Хотя в основном он используется для таких случаев, он имеет встроенный планировщик, который можно использовать с именем beat.
Beat, как следует из названия, представляет собой планировщик, который помещает сообщения в очередь брокера сообщений при достижении предопределенного временного интервала — либо через базовые интервалы, либо через сложные выражения cron. Как только beat помещает сообщения в брокер сообщений, они становятся доступными для использования следующим доступным работником Celery.
Чтобы создавать периодические задачи, нам нужно начать с определения их в наших настройках. Это заставляет Celery beat проверять настройку, чтобы обнаруживать задачи, которые необходимо периодически выполнять.
Чтобы начать работу с Celery, вам понадобится установленный брокер, например Redis. После того, как ваш брокер установлен, вы можете приступить к установке сельдерея.
Следует обратить внимание на то, что задания могут перекрываться, если задание не завершится до запуска следующего. Об этом следует помнить всякий раз, когда вы составляете свой планировщик заданий. Такие вещи, как семафоры и блокировки Redis, могут использоваться для смягчения этого поведения, если оно нежелательно.
Создайте файл с именем tasks.py и добавьте ниже код, который показывает, как периодически запускать задания, добавляя несколько интервалов.
Celery требует, чтобы работники и бит были запущены для выполнения Джобса. Приведенная ниже команда запускает как worker, так и beat в одной команде. В производственной среде оба должны запускаться как независимые службы либо через контейнеры, либо через диспетчер процессов супервизора, что является лучшим вариантом, чем службы Unix.
Запуск указанной выше команды запустит запланированные задания с выводом ниже.

Временная петля № 5
Timeloop — это библиотека, которую можно использовать для выполнения задач с несколькими периодами. Это простая библиотека, которая использует шаблон декоратора для выполнения функций с тегами в потоках. Если вы хотите воспользоваться преимуществами ядер, возможно, вам не стоит использовать эту библиотеку. Этого достаточно для простых случаев использования, если вам не нужен полноценный фреймворк или вам нужно что-то простое для включения в свои веб-приложения или автономные приложения на Python. Чтобы начать использовать библиотеку, установите ее через pip.
См. Ниже, как преобразовать любую функцию Python для работы в потоке с заданным интервалом триггера.
№6. Несвязанное планирование на основе очередей
Если вам нужно добавить некоторую предсказуемость и избыточность к вашим запланированным заданиям, вы можете выбрать создание распределенного планировщика заданий, используя AMQP, RabbitMQ или любой стек очередей по вашему выбору.
Это дает вам возможность масштабировать планировщик заданий. Использование делегатов очереди работает между потребителями через обмен, который определяет, какие сообщения должна получать очередь, в зависимости от типа обмена и некоторых параметров очереди.
Обмен фактически является безопасным местом для публикации сообщений, которые отделены от производителя и предоставляют всю необходимую информацию о доступных потребителях. Обмен принимает сообщение и пересылает его.
Продюсер
Ключевой особенностью этого дизайна является производитель, который обрабатывает события cron и публикует их для обмена. Запланированные рабочие могут просто привязаться к общей очереди . Этот дизайн реализован с помощью системы AMQP, такой как RabbitMQ, не зависит от производителя и может быть многооблачным. У Python есть клиенты RabbitMQ, такие как pika, с которыми легко работать и начать работу.
Планировщик заданий на основе очередей — это простой способ разделить производителей и потребителей. Это также решает некоторые проблемы, связанные с тем, что многие традиционные планировщики не имеют механизма воспроизведения.
Планировщики заданий на основе очередей полезны в том случае, если вы переросли простые планировщики на основе cron. Есть случаи, когда вам нужно немного больше от запланированных на Python заданий, таких как:
- Расписания заданий, которые должны обрабатывать сложные отношения между заданиями (например, одно задание запускает другое задание), например, конечный автомат; или запланированные задания на основе рабочего процесса, такие как планирование ETL для больших данных.
- У вас должны быть сложные механизмы повторной попытки для невыполненных запланированных заданий с механизмами отчетов и предупреждений.
№7. Apache Airflow
Прямой акриловый график Airflow, сокращенно DAG, предлагает способ построения и планирования сложных и динамических рабочих процессов данных с использованием Python. Airflow в основном известен своей способностью создавать рабочие процессы, использующие внешние ресурсы, такие как базы данных СУБД или настраиваемые сценарии, для выполнения преобразования и очистки данных, связанных с ETL. Хотя это не единственное, для чего он нужен. С помощью нескольких конфигураций в вашем коде Python вы можете создать довольно надежный планировщик заданий, который можно легко интегрировать с Dask и другими фреймворками машинного обучения.
Группы DAG и операторы
В Airflow все рабочие процессы представляют собой группы DAG, которые можно описать как набор задач со связями. Когда дело доходит до планирования заданий с помощью python, группы доступности базы данных в Airflow можно планировать несколькими способами. Они могут иметь регулярные временные интервалы без конкретной отправной точки. Cron планирует однократное выполнение, ручные триггеры, которые должны запускаться внешним событием — будь то через другой DAG, HTTP-запрос или другую службу.
Еще одна ключевая особенность воздушного потока — это возможность воспроизводить задачи, как если бы задача выполнялась в прошлом, с помощью функции, называемой Backfilling. Всегда рекомендуется, чтобы ваши задания, выполняемые с использованием обратной засыпки, были идемпотентными, чтобы гарантировать, что запуск программы приведет к тому же конечному результату, как вызов REST API через метод HTTP GET.
Хотя Airflow — полезный инструмент для выполнения запланированных заданий с помощью Python для процессов ETL или любой другой задачи, легко попасть в этот бесконечный цикл, полагая, что Airflow — это решение всех ваших проблем с Python. Хотя Airflow хорош в том, что делает (планирование заданий и ациклические рабочие процессы), он не предназначен для распределенных вычислений — так что всегда имейте это в виду. Airflow требует, чтобы хотя бы один воркер был запущен и работал в любой момент времени, независимо от того, используется ли этот воркер на самом деле. Некоторые из этих недостатков распределения могут быть устранены путем подключения к другим исполнителям воздушного потока.
«Исполнитель связывается с планировщиком, чтобы выделить ресурсы для каждой задачи по мере их постановки в очередь»
Последовательный исполнитель: исполнитель по умолчанию для локальных запусков. Выполняйте задания последовательно на одном компьютере и используйте SQLite для хранения метаданных задания.
Локальный исполнитель: выполняет задачи параллельно и требует базы данных, которая поддерживает параллелизм, например PostgreSQL.
Celery Executor: делегаты, работающие с сельдереем, естественно, требуют Redis или RabbitMQ для рассылки сообщений рабочим.
Kubernetes Executor: создает новый модуль для каждого экземпляра задачи и получает те же преимущества, что и сельдерей.
Чтобы начать работу с Airflow, выполните следующие команды ниже прямо из вашего терминала с помощью pip. Обратите внимание: по умолчанию Airflow использует SQLite для сохранения данных, связанных с триггерами и DAG. Вы можете ознакомиться с более подробной документацией на веб-сайте Airflow.
Убедитесь, что Airflow был успешно установлен, введя следующую команду на вашем терминале: airflow version Это должно напечатать номер версии без ошибок. Следующие шаги используются для запуска базы данных и независимого запуска планировщика и сервера Airflow.
Airflow Scheduler — это процесс мониторинга, который выполняется все время и запускает выполнение задачи на основе schedule_interval и execution_date.

После того, как вы запустите Airflow, вам будет представлено окно, показанное выше, в котором демонстрируется пример кода, чтобы вы познакомились с фреймворком. Вышеупомянутые существующие группы DAG демонстрируют различные типы доступных операторов, которые состоят из одного или нескольких из следующих операторов.
- BashOperator — выполняет команду bash
- PythonOperator — вызывает произвольную функцию Python
- EmailOperator — отправляет электронное письмо
- SimpleHttpOperator — отправляет HTTP-запрос
- MySqlOperator , SqliteOperator , PostgresOperator , MsSqlOperator , OracleOperator , JdbcOperator и т. Д. — выполняет команду SQL
- Sensor — ждет определенное время, файл, строка базы данных, ключ S3 и т. Д.
Ниже приведен пример того, как вы могли бы создать запланированную работу DAG, используя PythonOperator.
Создайте новую папку в $ HOME / $ AIRFLOW_HOME / dags и добавьте вновь созданный скрипт python, который будет содержать ваш DAG. Ваш рабочий процесс будет автоматически выбран и запланирован для запуска после того, как вы включите новую группу обеспечения доступности баз данных.
Возможности Apache Airflow безграничны. С помощью вызовов функций python вы можете интегрировать что угодно в свои запланированные задания — от вызова модулей Kubernetes с KubernetesPodOperator до делегирования работы внешним службам и подключения к гибридному решению, которое хранит конфиденциальные данные внутри Airflow. Делегируя машинное обучение Saturn Cloud, кластеры dask могут выполнять распределенные вычисления больших наборов данных pandas.

Ниже мы более подробно рассмотрим некоторые из ваших вариантов и вещей, которые следует учитывать при разработке запланированных заданий. Некоторые из этих практик уже реализованы в облачных сервисах и сторонних библиотеках с открытым исходным кодом, таких как Celery. Хорошее понимание того, как разрабатывать вещи с нуля, одинаково важно, если вы когда-либо сталкивались с ситуацией, когда вам нужно развертывать свои системы без привязки к поставщику.
Выбор архитектурного дизайна по расписанию
Теперь, когда мы увидели некоторые способы использования решений с открытым исходным кодом для создания запланированных заданий, давайте рассмотрим некоторые важные варианты дизайна, которые необходимо учитывать. В зависимости от характера вашего бизнеса или от того, насколько критично выполнение запланированных заданий без минимального времени простоя, простые запланированные задания имеют некоторые фундаментальные недостатки, которые необходимо устранить.
Большинство библиотек планирования были разработаны для работы на одном компьютере, то есть всегда будет один экземпляр планировщика. Если по какой-либо причине один компьютер выйдет из строя, планировщик не сможет запускать будущие задания. Такая конструкция создает серьезные проблемы в случае отказа, поскольку отсутствует резервирование.
Запланированные задания предназначены для выполнения периодической работы, такой как сборка мусора или HTTP-запросы к статическим источникам данных, которые являются идемпотентными по своей природе. В случае неисправности системы можно безопасно запускать такие задания несколько раз. С другой стороны, у вас есть запланированные задания, например, те, которые обрабатывают банковские транзакции, или те, которые отправляют уведомления по электронной почте в большой список рассылки — они никогда не должны запускаться более одного раза.
Ситуация усложняется, поскольку некоторые запланированные задания могут иметь приемлемый уровень сбоя. Возьмем, к примеру, задание cron по сборке мусора, запускаемое каждые 10 минут. Это может позволить пропустить один или несколько запусков без каких-либо последствий. Такое большое разнообразие запланированных заданий делает создание решения, учитывающего сбои, сложной задачей. Следовательно, при разработке решения необходимо подумать об избыточности, управлении состоянием посредством некоторой формы распределения и возможности восстановления, чтобы в случае сбоя можно было эффективно выполнить восстановление отказавших заданий.
Один из подходов, о котором следует подумать при разработке решения, в котором отказ недопустим, — это конструкция «ведущий-ведомый». Здесь одно главное задание отвечает за изменение общего состояния и отвечает за запуск заданий cron. Если мастер умирает, срабатывают проверки работоспособности, и подчиненные берут на себя планирование ваших заданий. Подчиненные реплики также несут ответственность за отслеживание состояния, предоставленного ведущим, чтобы взять на себя управление в случае сбоя.
Спроектировать такую распределенную систему, которая будет отказоустойчивой и невосприимчивой к сбоям, — это еще не все. Сложно создать единое целое. Чтобы по-настоящему построить распределенный планировщик заданий, нужно также мыслить в смысле согласованных алгоритмов, которые могут гарантировать репликацию данных между ведущим и ведомыми устройствами. Об этом написано много литературы, и даже Google основал свой собственный распределенный планировщик заданий на этом дизайне.
Если вы ищете более продвинутых планировщиков вакансий, Chronos и Luigi — это инструменты с открытым исходным кодом, которые вы можете изучить. В них реализовано распределение и отказоустойчивость. Выбор дизайна полностью зависит от вашего варианта использования.
Последние мысли
Создание действительно надежного планировщика заданий требует времени и усилий. Большинство традиционных подходов полагаются исключительно на какую-то форму cron и какие-то сценарии взлома bash.
С инструментами и параметрами, представленными в этой статье, управление запланированными заданиями не должно быть утомительным. Вы можете быстро приступить к созданию планировщиков заданий, которые помогут автоматизировать большую часть, если не все, конвейеров обработки данных, и создать планировщики заданий ETL, выполняющие извлечение данных. Он может помочь вам передать извлеченные данные в такие сервисы, как Dask, предлагаемые Saturn Cloud, что значительно упрощает масштабирование ваших моделей науки о данных, глубокого обучения и машинного обучения.
Улучшенный планировщик заданий Python
Модуль APScheduler , также известен как Advanced Python Scheduler (улучшенный планировщик заданий). Как следует из названия, это одна из самых продвинутых библиотек планировщика, доступных в Python, с множеством различных функций и параметров планирования.
Установка APScheduler в виртуальное окружение.
Так как модуль APScheduler не входит в стандартную библиотеку Python, его необходимо установить отдельно. сделать это можно с помощью менеджера пакетов pip .
Содержание:
Основные понятия модуля APScheduler.
Триггеры содержат логику планирования. Каждое задание имеет свой собственный триггер, который определяет, когда задание должно быть запущено следующим. Помимо своей первоначальной конфигурации, триггеры не имеют состояния.
Хранилище заданий содержат запланированные задания. Хранилище заданий по умолчанию просто хранит задания в памяти, но другие встроенные хранилища хранят их в различных базах данных. Данные задания сериализуются, когда они сохраняются в постоянном хранилище заданий, и десериализуются, когда они загружаются обратно из него. Хранилища заданий (кроме хранилища по умолчанию) выступают в качестве посредников для сохранения, загрузки, обновления и поиска заданий в бэкэнде . Хранилища заданий никогда не должны использоваться совместно планировщиками.
Исполнители — это то, что обрабатывает выполнение заданий. Другими словами исполнитель, отправляют назначенный вызываемый объект (функцию) в задании в поток или пул процессов. Когда задание выполнено, он уведомляет планировщик, который затем генерирует соответствующее событие.
Планировщик — это то, что связывает все вместе. Другими словами это надлежащий интерфейс для работы с хранилищами заданий, исполнителями или триггерами. Настройка хранилищ заданий и исполнителей выполняется через планировщик, как и добавление, изменение и удаление заданий.
Как правильно выбрать планировщик, хранилище и исполнителей.
- BlockingScheduler : используется, когда в процессе работает только планировщик, например, отдельный скрипт/модуль, заменяющий системный cron операционной системы Linux .
- BackgroundScheduler : используется, когда не используются фреймворки, указанные ниже и необходимо, чтобы планировщик работал в фоновом режиме внутри какого-то приложения.
- AsyncIOScheduler : используется, если приложение использует модуль asyncio .
- GeventScheduler : используется, если приложение использует gevent .
- TornadoScheduler : используется, если создается приложение Tornado .
- TwistedScheduler : используется, если создается приложение Twisted .
- QtScheduler : используйте, если создается приложение Qt .
Если приложение использует один из вышеперечисленных фреймворков, то выбор исполнителя очевиден. В противном случае, для большинства целей исполнителя по умолчанию ThreadPoolExecutor должно быть достаточно. Если рабочая нагрузка включает в себя операции с интенсивным использованием ЦП, то следует рассмотреть возможность использования ProcessPoolExecutor , чтобы использовать несколько ядер ЦП. Можно использовать оба сразу, добавив исполнитель пула процессов в качестве вторичного исполнителя.
Чтобы выбрать подходящее хранилище заданий, нужно понять, должны ли задания сохраняться после перезапуска планировщика или нет. Если задания всегда воссоздаются в начале приложения кодом, то, можно использовать значение по умолчанию ( MemoryJobStore ). Но если нужно, чтобы задания сохранялись после перезапуска планировщика или сбоя приложения, то выбор обычно сводится к тому, какие инструменты используются в кодовой базе приложения. Если есть свободный выбор, то рекомендуется использовать SQLAlchemyJobStore , а на сервере PostgreSQL из-за надежной защиты целостности данных.
Триггеры планировщика заданий APScheduler
Когда планируется задание, то для него нужно выбрать триггер. Триггер определяет логику, по которой вычисляются даты/время при запуске задания. Модуль APScheduler поставляется с тремя встроенными типами триггеров:
- date : используется, когда нужно запустить задание только один раз в определенный момент времени.
- interval : используется, когда нужно запускать задание через фиксированные интервалы времени.
- cron: используется, когда нужно периодически запускать задание в определенное время дня.
Также возможно объединить несколько триггеров в один, который срабатывает либо в моменты времени, согласованные всеми участвующими триггерами, либо когда сработает любой из триггеров.
Настройка планировщика APScheduler.
APScheduler предоставляет множество различных способов настройки. Можно использовать словарь конфигурации или передать параметры в качестве ключевых аргументов . Также можно сначала создать экземпляр планировщика, а затем добавить задания и настроить планировщик.
Допустим, необходимо иметь два хранилища заданий с использованием двух исполнителей, а также настроить значения по умолчанию для новых заданий и установить другой часовой пояс.