You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: README.md
+6-2Lines changed: 6 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -24,11 +24,15 @@ Jobify uses the native timer mechanisms of asyncio for efficient and precise tas
24
24
25
25
## Key Features
26
26
27
-
-[x][**Async/Await**](https://theseriff.github.io/jobify/#why-jobify): Built from the ground up with `asyncio`in mind.
27
+
-[x][**Precision**](https://theseriff.github.io/jobify/#why-jobify): No polling! Uses native `asyncio`timers for sub-millisecond accuracy and zero idle CPU usage.
28
28
-[x][**Scheduling**](https://theseriff.github.io/jobify/schedule/): Run jobs immediately, with a delay, at a specified time, or using Cron expressions (second-level precision supported).
29
29
-[x][**Storage**](https://theseriff.github.io/jobify/app_settings/#storage): Built-in SQLite ensures scheduled jobs persist through application restarts.
30
30
-[x][**Routing**](https://theseriff.github.io/jobify/router/): Organize tasks with `JobRouter`, similar to FastAPI or Aiogram.
31
-
-[x][**Error Handling**](https://theseriff.github.io/jobify/advanced_usage/exception_handlers/): Comprehensive middleware for automatic retries, timeouts, and custom error handling.
31
+
-[x][**Inject Context**](https://theseriff.github.io/jobify/context/): Inject application state or custom dependencies directly into your tasks.
32
+
-[x][**Middlewares**](https://theseriff.github.io/jobify/app_settings/#middleware): Powerful interceptors for both job execution and the scheduling process.
33
+
-[x][**Exception Handlers**](https://theseriff.github.io/jobify/advanced_usage/exception_handlers/): Hierarchical error management at the task, router, or global level.
34
+
-[x][**Lifespan Support**](https://theseriff.github.io/jobify/app_settings/#lifespan): Manage startup and shutdown events, just like in FastAPI.
35
+
-[x][**Job Control**](https://theseriff.github.io/jobify/job/): Full control over jobs — wait for completion, cancel tasks, or check results with ease.
32
36
-[x][**Concurrency**:](https://theseriff.github.io/jobify/task_settings/#run_mode) Supports `asyncio`, `ThreadPoolExecutor`, and `ProcessPoolExecutor` for efficient task handling.
33
37
-[ ] Distributed task queue. Soon.
34
38
-[ ] Many different adapters to the database. Soon.
Copy file name to clipboardExpand all lines: docs/index.md
+33-20Lines changed: 33 additions & 20 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -6,32 +6,41 @@ similar to modern web frameworks like FastAPI.
6
6
7
7
## Key Features
8
8
9
-
-**Async First**: Built on top of `asyncio`.
10
-
-[**Flexible Scheduling**](schedule.md#dynamic-scheduling){ data-preview }: Run jobs immediately, after a delay, at a specific time, or via Cron expressions.
11
-
-**Persistence**: Built-in SQLite storage ensures scheduled jobs survive application restarts.
12
-
-[**Modular**](router.md){ data-preview }: Organize tasks using `JobRouter`s (similar to FastAPI routers).
13
-
-**Resilient**: Middleware support for automatic retries, timeouts, and error handling.
14
-
-[**Concurrency**](task_settings/#run_mode){ data-preview }: Support for `asyncio`, `ThreadPoolExecutor`, and `ProcessPoolExecutor`.
9
+
-[**Precision**](#why-jobify){ data-preview }: No polling! Uses native `asyncio` timers for sub-millisecond accuracy and zero idle CPU usage.
10
+
-[**Scheduling**](schedule.md){ data-preview }: Run jobs immediately, with a delay, at a specified time, or using Cron expressions (second-level precision supported).
11
+
-[**Storage**](app_settings.md#storage){ data-preview }: Built-in SQLite ensures scheduled jobs persist through application restarts.
12
+
-[**Routing**](router.md){ data-preview }: Organize tasks with `JobRouter`, similar to FastAPI or Aiogram.
13
+
-[**Inject Context**](context.md){ data-preview }: Inject application state or custom dependencies directly into your tasks.
14
+
-[**Middlewares**](app_settings.md#middleware){ data-preview }: Powerful interceptors for both job execution and the scheduling process.
15
+
-[**Exception Handlers**](advanced_usage/exception_handlers.md){ data-preview }: Hierarchical error management at the task, router, or global level.
16
+
-[**Lifespan Support**](app_settings.md#lifespan){ data-preview }: Manage startup and shutdown events, just like in FastAPI.
17
+
-[**Job Control**](job.md){ data-preview }: Full control over jobs — wait for completion, cancel tasks, or check results with ease.
18
+
-[**Concurrency**](task_settings.md#run_mode){ data-preview }: Supports `asyncio`, `ThreadPoolExecutor`, and `ProcessPoolExecutor` for efficient task handling.
19
+
-**Distributed task queue**: Soon.
20
+
-**Many different adapters to the database**: Soon.
21
+
-**Many different serializers**: Soon.
15
22
16
23
## Comparison
17
24
18
25
You might have seen other libraries like `APScheduler`, `Celery`, or `Taskiq`.
19
26
Below is a comparison of features to help you decide if Jobify fits your needs.
@@ -42,6 +51,9 @@ Jobify uses the low-level asyncio.loop.call_at API.
42
51
2.**Precision**: Tasks are triggered precisely by the internal timer of the event loop, ensuring sub-millisecond accuracy and avoiding the "jitter" that can be associated with sleep intervals.
43
52
3.**Native**: It works in harmony with OS-level event notification systems (epoll/kqueue).
44
53
54
+
!!! note "The Precision vs. Polling Trade-off"
55
+
Jobify consciously avoids polling in order to achieve maximum efficiency and sub-millisecond precision. This architectural decision means that the scheduler is sensitive to significant changes in the operating system's clock. For more information on this trade-off and why it is important, please see [System Time and Scheduling](advanced_usage/system_time.md){ data-preview }.
Copy file name to clipboardExpand all lines: docs/integrations.md
+3-3Lines changed: 3 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -11,7 +11,7 @@ Jobify is designed to be extensible. Below are the community-supported and offic
11
11
FastAPI and other ASGI frameworks that support lifespan don't need a separate integration. Just add the code below to your lifespan or startup/shutdown handlers:
Copy file name to clipboardExpand all lines: docs/schedule.md
+3Lines changed: 3 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -2,6 +2,9 @@
2
2
3
3
You can schedule tasks in two main ways: using recurring cron expressions or dynamically at runtime.
4
4
5
+
!!! info "Precision & System Time"
6
+
Jobify uses high-precision timers instead of polling, which makes the scheduler very efficient. However, this also means that it is sensitive to changes in the system time. For details, see [System Time and Scheduling Trade-offs](advanced_usage/system_time.md).
7
+
5
8
## Cron Expressions
6
9
7
10
`Jobify` uses the [crontab](https://pypi.org/project/crontab/) library to parse and schedule jobs from cron expressions. This provides a flexible and powerful way to define recurring tasks.
0 commit comments