Skip to main content

Simple in-process scheduler

Project description

Classic Scheduler

Предоставляет простой in-process планировщик, способный выполнять задачи по cron-расписанию, периодически и отложенно.

Пример:

from classic.scheduler import Scheduler


def func():
    print('Hello world!')

scheduler = Scheduler()
scheduler.with_delay(1, func)
scheduler.by_period(5, func)
scheduler.by_cron('* * * * *', func)
scheduler.run()

# Hello world!
# Hello world!
# Hello world!
# ...

Многопоточность

У Scheduler есть параметр в конструкторе - workers_num, по умолчанию равный 1. Этот параметр задает количество потоков в ThreadPool, используемому под капотом. При значении workers_num = 0 задачи будут выполняться в том же потоке, что и планировщик, последовательно.

Также у планировщика есть 2 способа запуска - методы .run() и .start().

Метод .run() вводит поток в вечный цикл, в котором происходит управление задачами по расписанию.

Метод .start() запускает фоновый поток, в котором выполняется .run(). Также планировщик имеет метод .stop(), используя который можно отправить сообщение об остановке. Также .stop имеет параметры block и timeout, позволяющие остановить текущий поток в ожидании завершения фонового потока, и установить время ожидания остановки.

Метод .join() блокирует текущий поток в ожидании завершения фонового потока

Интеграция с classic-components

Если используется совместно с classic-components, то можно использовать декораторы by_period и by_cron на классах с логикой, чтобы упростить регистрацию задач:

from classic.components import component
from classic.scheduler import Scheduler, by_period, by_cron


@component
def SomeLogic:
    
    @by_period(1)
    def need_to_call_periodically(self):
        print('Hello')
    
    @by_cron('* * * * *')
    def need_to_call_by_schedule(self):
        print('Hi')


scheduler = Scheduler()
some_logic = SomeLogic(scheduler=scheduler)  # Регистрация произойдет при инстанцировании компонента
scheduler.run()

# Hello
# Hi

Отмена вызова (удаление задачи)

Если расписание задач планируется динамически менять, например, удалить ранее созданную задачу, то при создании задачи в методах необходимо указать атрибут task_name. Пример:

from classic.scheduler import Scheduler

scheduler = Scheduler()
scheduler.by_period(1, lambda: print('hello'), task_name='periodic task')
scheduler.cancel('periodic task')

Тогда в дальнейшем вы можете отменить запланированные запуски задач через:

scheduler.cancel('periodic task')

Параметризация вызываемой функции

Планировщик может запускать и функции с аргументами. Аргументы передаются через атрибуты args и kwargs. Отдельно заметим, что вызываемые объекты так же могут быть акторами, как в примере ниже:

from classic.scheduler import Scheduler


def print_sum(a, b):
    print(f'a + b = {a+b}')

    
scheduler = Scheduler()
scheduler.run()
scheduler.by_period(
    2,
    print_sum,
    args=(2, 6),
)
# a + b = 8
# a + b = 8
# a + b = 8
# ...

Типы задач

После создания экземпляра планировщика нужно добавить в него задач. Планирование и выполнение задач начнется только после запуска метода run(). Отметим, что добавлять задачи в планировщик можно и после вызова метода run().

Планировщик поддерживает три типа задач:

Одноразовая отложенная задача

Создается через вызов метода планировщика with_delay. Задача будет выполнена ровно один раз. Ее вызов отложен на delay указанный либо в секундах в float либо в timedelta.

Переодическая задача

Создается через вызов метода планировщика by_period. Задача выполнится в первый раз, затем она будет выполнятmся через период periodic, заданный либо в секундах в float либо в timedelta.

Задача по расписанию

Создается через вызов метода планировщика by_cron. Задача вызов который задается в формате CRON строкой.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

classic_scheduler-1.4.1.tar.gz (10.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

classic_scheduler-1.4.1-py3-none-any.whl (8.7 kB view details)

Uploaded Python 3

File details

Details for the file classic_scheduler-1.4.1.tar.gz.

File metadata

  • Download URL: classic_scheduler-1.4.1.tar.gz
  • Upload date:
  • Size: 10.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for classic_scheduler-1.4.1.tar.gz
Algorithm Hash digest
SHA256 012032ab9e6f1a428aebe8efbe4c8602d359724f8a807ca3d892cf3da69a6c6e
MD5 9a03be22cc4d69e29e7a080df145809e
BLAKE2b-256 92832993637d7ccb4d9d49038348ab6fa50d2a7598f2591d561571de818977e6

See more details on using hashes here.

Provenance

The following attestation bundles were made for classic_scheduler-1.4.1.tar.gz:

Publisher: publish.yml on variasov/classic-scheduler

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file classic_scheduler-1.4.1-py3-none-any.whl.

File metadata

File hashes

Hashes for classic_scheduler-1.4.1-py3-none-any.whl
Algorithm Hash digest
SHA256 ce3b51d36c61e57e7dd0d5c024d804270fd2881edd1ed97353f654d9b6dcf0f7
MD5 07d2b46c71bab215d3950df88ee96685
BLAKE2b-256 7f9990722bb927ad7f93f68c3b2e252a81aa8461f92010dc6f727b9e22cc7998

See more details on using hashes here.

Provenance

The following attestation bundles were made for classic_scheduler-1.4.1-py3-none-any.whl:

Publisher: publish.yml on variasov/classic-scheduler

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page