Metadata-Version: 2.1
Name: classic-scheduler
Version: 1.1.1
Summary: Provides scheduler
Home-page: https://github.com/variasov/classic-scheduler
Author: Sergei Variasov, Vasiliy Pichugin
Author-email: variasov@gmail.com, pichugin_v_i@mail.ru
Project-URL: Bug Tracker, https://github.com/variasov/classic-scheduler/issues
Classifier: Programming Language :: Python :: 3.10
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Classifier: Development Status :: 4 - Beta
Requires-Python: >=3.10
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: croniter~=3.0
Provides-Extra: dev
Requires-Dist: pytest~=6.2; extra == "dev"
Requires-Dist: pytest-cov~=2.12; extra == "dev"
Requires-Dist: twine~=3.4; extra == "dev"
Requires-Dist: build~=0.7; extra == "dev"

# Classic Scheduler

## Планировщик

Данная библиотека является продолжением библиотеки акторов `classic actors`. И, как следствие, она зависит от библиотеки акторов.

Планировщик - это актор, который вызывает функции по расписанию.

Рассмотрим пример использования библиотеки:

```python
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!
# ...
```

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

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

```python
scheduler = Scheduler()
scheduler.by_period(1, func, task_name='periodic task')
```

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

```python
scheduler.cancel('periodic task')
```

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

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

```python
class SomeActor(Actor):

    @Actor.method
    def func(self, a, b):
        print('a + b =', a + b)

some_actor = SomeActor()
some_actor.run()

scheduler = Scheduler()
scheduler.run()
scheduler.by_period(
    2,
    some_actor.func,
    args=(2, 6),
    task_name='some_actor_task',
)
# a + b = 8
# a + b = 8
# a + b = 8
# ...
```

## Типы задач

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

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

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

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

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

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

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

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