A modern, lightweight and robust task manager with a user-friendly interface and a wide range of features, using the low-level asyncio API and more.
Project description
Documentation: https://theseriff.github.io/jobify/
Jobify is a powerful framework for scheduling and managing background jobs in Python. It allows you to easily define and schedule jobs using an intuitive decorator-based API, similar to that of modern web frameworks such as FastAPI.
Unlike many other frameworks that use polling (continuous loops) to schedule tasks, Jobify uses the native timer mechanisms of asyncio for efficient and precise task scheduling.
Key Features
- Async/Await: Built from the ground up with
asyncioin mind. - Scheduling: Run jobs immediately, with a delay, at a specified time, or using Cron expressions (second-level precision supported).
- Storage: Built-in SQLite ensures scheduled jobs persist through application restarts.
- Routing: Organize tasks with
JobRouter, similar to FastAPI or Aiogram. - Error Handling: Comprehensive middleware for automatic retries, timeouts, and custom error handling.
- Concurrency: Supports
asyncio,ThreadPoolExecutor, andProcessPoolExecutorfor efficient task handling. - Dependency Injection: Powerful system for injecting job contexts.
Installation
Install Jobify from PyPI:
pip install jobify
Quick Start
Here is an example of how to define and schedule a task:
import asyncio
from datetime import datetime, timedelta
from zoneinfo import ZoneInfo
from jobify import Jobify
UTC = ZoneInfo("UTC")
# 1. Initialize Jobify
app = Jobify(tz=UTC)
@app.task(cron="* * * * * * *") # Runs every second
async def my_cron(name: str) -> None:
print(f"Hello, {name}! cron running every second")
@app.task
def my_job(name: str) -> None:
now = datetime.now(tz=UTC)
print(f"Hello, {name}! job running at: {now!r}")
async def main() -> None:
# 2. Run the Jobify application context
async with app:
# Schedule a one-time job at a specific time
run_next_day = datetime.now(tz=UTC) + timedelta(days=1)
job_at = await my_job.schedule("Connor").at(run_next_day)
# Schedule a one-time job after a delay
job_delay = await my_job.schedule("Sara").delay(seconds=20)
# Start a dynamic cron job
job_cron = await my_cron.schedule("Mike").cron(
"* * * * *",
job_id="dynamic_cron_id",
)
# Wait for specific jobs to complete
await job_delay.wait()
# You can also use `await app.wait_all()` to wait for all currently
# running jobs. Note that infinite cron jobs will block this indefinitely.
# await app.wait_all()
if __name__ == "__main__":
asyncio.run(main())
License
This project is licensed under the terms of the MIT license.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file jobify-0.6.0.tar.gz.
File metadata
- Download URL: jobify-0.6.0.tar.gz
- Upload date:
- Size: 30.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.9.28 {"installer":{"name":"uv","version":"0.9.28","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
309dd0e1d4dee88b92fcdf442c09f060e3dca2ad1b37a88d845ab8c7678a4403
|
|
| MD5 |
aec937c92dc1ef89e3b6bff0827ccc99
|
|
| BLAKE2b-256 |
35293b0d3213c2470e1341b343fe02d3a18f178dd6cb2a6f46ec5abd9904a8fd
|
File details
Details for the file jobify-0.6.0-py3-none-any.whl.
File metadata
- Download URL: jobify-0.6.0-py3-none-any.whl
- Upload date:
- Size: 46.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.9.28 {"installer":{"name":"uv","version":"0.9.28","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
761cf801f2dacd3e61dd7e669e6d61869e7262e2e27d669fbefbbe8d5292d8dd
|
|
| MD5 |
52cde1c1a4ccd9e4e843f8253f31de85
|
|
| BLAKE2b-256 |
3737ef4b722f294da54fc4aa24e06b7a1ca69a6848dbb9eafaa9b6cdc5fb1d8c
|