Task
- Start here: Task Scheduler guide
- Common recipes:
Tasks,Interval Task,TaskRouter - Cluster-wide: gate per-process tasks with
TaskLockorLeaderElection.
grelmicro.task
Task.
Each name loads its submodule on first access.
TaskError
Bases: GrelmicroError
Base grelmicro Task error.
Tasks
Tasks(
*,
auto_start: bool = True,
tasks: list[Task] | None = None,
timezone: str | None = None,
shutdown_timeout: float | None = None,
env_prefix: str | None = None,
env_load: bool | None = None,
)
Bases: TaskRouter, Reconfigurable[TasksConfig]
Tasks.
Tasks class, the main entrypoint to manage scheduled tasks.
Supports live reconfiguration of shutdown_timeout via
reconfigure(new_config). A swap applies to the next shutdown, not
to a drain already under way. timezone is startup-only: changing
the zone under a running cron task would move which wall-clock fire
counts as due, and the durable last-fire state would either replay a
fire or swallow one. See
Live reconfiguration.
Initialize Tasks.
| PARAMETER | DESCRIPTION |
|---|---|
auto_start
|
Automatically start all tasks.
TYPE:
|
tasks
|
A list of tasks to be started.
TYPE:
|
timezone
|
The IANA timezone name every cron task uses. A cron task that passes its own Default:
TYPE:
|
shutdown_timeout
|
Seconds to let running tasks finish their current unit of work on shutdown before they are force-cancelled. On exit a stop signal is raised so tasks unwind as soon as their in-flight work completes; this only bounds how long a task stuck mid-work delays shutdown. Defaults to When unset and env reads are enabled, resolves from
TYPE:
|
env_prefix
|
Override the auto-derived environment variable prefix. Default:
TYPE:
|
env_load
|
Whether to read environment variables. When None (the default), follow the process-wide
TYPE:
|
| RAISES | DESCRIPTION |
|---|---|
SettingsValidationError
|
If a setting fails validation. |
timezone
property
timezone: str
The IANA timezone name cron tasks use unless they set their own.
from_config
classmethod
from_config(
config: TasksConfig,
*,
auto_start: bool = True,
tasks: list[Task] | None = None,
) -> Self
Construct a Tasks from a pre-built TasksConfig.
| PARAMETER | DESCRIPTION |
|---|---|
config
|
The pre-built tasks configuration. Use this path when the configuration is assembled at
startup from a settings tree (for example YAML, Vault,
or a
TYPE:
|
auto_start
|
Automatically start all tasks.
TYPE:
|
tasks
|
A list of tasks to be started.
TYPE:
|
start
async
start() -> None
Start all tasks manually.
TasksConfig
Bases: BaseModel
Tasks Config.
timezone
class-attribute
instance-attribute
timezone: TimeZoneName = TimeZoneName(UTC_NAME)
IANA timezone every cron task uses unless it, or the TaskRouter holding it, sets its own.
shutdown_timeout
class-attribute
instance-attribute
shutdown_timeout: NonNegativeFloat = 30.0
Seconds to let running tasks finish their current unit of work on shutdown before they are force-cancelled.
TaskRouter
TaskRouter(
*,
tasks: list[Task] | None = None,
timezone: str | None = None,
)
Task Router.
TaskRouter class, used to group task schedules, for example to structure an app in
multiple files. It would then be included in the Tasks, or in another
TaskRouter.
Initialize the task router.
| PARAMETER | DESCRIPTION |
|---|---|
tasks
|
A list of tasks to be scheduled.
TYPE:
|
timezone
|
The IANA timezone name every cron task in this router uses. A cron task that passes its own
TYPE:
|
| RAISES | DESCRIPTION |
|---|---|
TimezoneError
|
If no timezone of that name can be loaded. |
tasks
property
tasks: list[Task]
List of scheduled tasks.
timezone
property
timezone: str | None
The timezone this router declares, or None when it declares none.
A router reports only what it was given. The timezone its tasks
end up using is resolved by the owning Tasks when it starts, and
a router does not read the value it would inherit.
add_task
add_task(task: Task) -> None
Add a task to the scheduler.
Marks the function a task exposes as function, so a decorator
applied below the one that registered it is refused instead of
wrapping calls the schedule will never make. IntervalTask and
CronTask both expose it. A Task of your own is marked when
it does the same, and left alone when it does not.
every
every(
*,
interval: int | timedelta,
name: str | None = None,
gate: Literal["claim"]
| TaskLock
| LeaderElection
| None = None,
sync: LockPrimitive | None = None,
) -> Callable[
[Callable[..., Any | Awaitable[Any]]],
Callable[..., Any | Awaitable[Any]],
]
Decorate a function to run it on a fixed interval.
Every worker runs it by default. Pass gate="claim" to run it
on one worker per interval, or a LeaderElection to run it on
the elected worker.
| PARAMETER | DESCRIPTION |
|---|---|
interval
|
The duration between each task run. Takes whole seconds or a Accuracy is not guaranteed and may vary with system load. Consider the execution time of the task when setting the interval.
TYPE:
|
name
|
The name of the task. If None, a name will be generated automatically from the function.
A gate locks under the task name, unless it is a
TYPE:
|
gate
|
Which workers run each interval.
A gated task renews its claim every third of the lease from
the moment it holds it until the body ends, so a body, and a
wait for a
TYPE:
|
sync
|
Optional resource-level synchronization primitive. Wraps the body once the gate lets this worker through. Use a
TYPE:
|
| RAISES | DESCRIPTION |
|---|---|
FunctionTypeError
|
If the task name generation fails. |
ValueError
|
If |
ValueError
|
If the gate |
SettingsValidationError
|
If the gate |
TypeError
|
If |
cron
cron(
expr: str,
*,
timezone: str | None = None,
name: str | None = None,
misfire_grace: int | timedelta | None = None,
backend: ScheduleBackend | None = None,
gate: Literal["claim"]
| LeaderElection
| Unset
| None = UNSET,
sync: LockPrimitive | None = None,
) -> Callable[
[Callable[..., Any | Awaitable[Any]]],
Callable[..., Any | Awaitable[Any]],
]
Decorate function to add it as a cron task.
Runs the task whenever the wall-clock time matches the cron expression in the given timezone.
Every worker runs each fire by default. Left out beside a schedule
backend, gate is reported as ungated-cron each time the task
starts, except in development and test. With gate="claim" or a
LeaderElection, each fire is claimed against a durable last-fire
state, so the task runs at most once across every worker per fire.
A fire missed while every worker was down replays once on restart,
bounded by misfire_grace, and only the most recent
missed fire runs.
The claim guarantee is at-most-once. A worker that claims a fire and then
crashes mid-run does not retry it, because the last-fire state already
advanced. Make the body idempotent, or wrap it with @retry, when
correctness depends on completion.
| PARAMETER | DESCRIPTION |
|---|---|
expr
|
The 5-field cron expression: Each field supports
TYPE:
|
timezone
|
The IANA timezone name used to compute fire times. When None (the default), the task takes the timezone
configured on the
TYPE:
|
name
|
The name of the task. If None, a name will be generated automatically from the function. Also used as the schedule name for the durable last-fire state.
TYPE:
|
misfire_grace
|
How late a missed fire may run when a worker comes back. Takes whole seconds or a Read only by a gated task. A fire missed while every worker
was down replays once on restart only when now is within
this duration of the fire. Past the budget, the fire is
dropped.
TYPE:
|
backend
|
The durable schedule backend. Read only by a gated task. By default, resolves through the
active
TYPE:
|
gate
|
Which workers run each fire.
A gated task with no schedule backend in scope reports a coordination error on every fire and runs nothing.
TYPE:
|
sync
|
Optional resource-level synchronization primitive. Wraps the body once the gate lets this worker through. Use a
TYPE:
|
| RAISES | DESCRIPTION |
|---|---|
FunctionTypeError
|
If the task name generation fails. |
CronError
|
If the cron expression is invalid. |
TimezoneError
|
If the timezone is not an IANA timezone name. |
TypeError
|
If |
ValueError
|
If |
ValueError
|
If |
include_router
include_router(router: TaskRouter) -> None
Include another router in this router.
| RAISES | DESCRIPTION |
|---|---|
TaskAddOperationError
|
If the tasks have already started. |
started
started() -> bool
Check if the task manager has started.
do_mark_as_started
do_mark_as_started() -> None
Mark the task manager as started.
Do not call this method directly. It is called by the task manager when the task manager is started.