Skip to main content
Jobify logo

Jobify

Robust async task scheduler for Python.

Event-driven timing, typed APIs, persistence, routing, and queue-based backpressure.

Supported Python versions PyPI version Tests Coverage CodSpeed License: MIT

Documentation • Quick Start • Community Extensions • Telegram

Contents

Why Jobify

Most Python schedulers rely on polling loops. Jobify uses low-level asyncio timers (call_at) to schedule jobs directly.

  • No idle polling CPU cost
  • Sub-millisecond trigger precision
  • Native async-first execution model

If your workload is bursty or downstream services are sensitive, use Queue Middleware to add bounded buffering, backpressure, and priority routing.

Installation

pip install jobify

Quick Start

import asyncio

from jobify import Jobify, Job

app = Jobify()


@app.task
async def hello(name: str) -> None:
    print(f"Hello, {name}")


async def main() -> None:
    async with app:
        job: Job = await hello.push("Alex")
        await job.wait()


if __name__ == "__main__":
    asyncio.run(main())
Extended example (cron, delay, absolute time)
import asyncio
from datetime import datetime, timedelta
from zoneinfo import ZoneInfo

from jobify import Jobify, Job

UTC = ZoneInfo("UTC")
app = Jobify(tz=UTC)


@app.task(cron="* * * * * * *")  # every second
async def my_cron() -> None:
    print("cron tick")


@app.task
def my_job(name: str) -> None:
    now = datetime.now(tz=UTC)
    print(f"Hello, {name}! at {now!r}")


async def main() -> None:
    async with app:
        await my_job.push("Alex")

        run_next_day = datetime.now(tz=UTC) + timedelta(days=1)
        job_at: Job = await my_job.schedule("Connor").at(run_next_day)
        job_delay: Job = await my_job.schedule("Sara").delay(seconds=20)
        job_cron: Job = await my_cron.schedule().cron("* * * * *", job_id="dynamic_cron_id")

        await job_at.wait()
        await job_delay.wait()
        await job_cron.wait()


if __name__ == "__main__":
    asyncio.run(main())

Key Features

Feature comparison (Jobify vs Taskiq/APScheduler/Celery)
Feature name Jobify Taskiq APScheduler (v3) Celery
Event-driven Scheduling ✅ (Low-level timer) ❌ (Polling/Loop) ❌ (Interval) ❌ (Polling/Loop)
Async Native (asyncio) ✅ ✅ ❌ (Sync mostly) ❌
Context Injection ✅ ✅ ❌ ❌
FastAPI-style Routing ✅ ❌ ❌ ❌
Middleware Support ✅ ✅ ❌ (Events only) ❌ (Signals)
Lifespan Support ✅ ✅ ❌ ❌
Exception Handlers ✅ (Hierarchical) ❌ ❌ ❌
Job Cancellation ✅ ❌ ✅ ✅
Cron Scheduling ✅ (Seconds level) ✅ (Minutes) ✅ ✅
Misfire Policy ✅ ❌ ✅ ❌
Run Modes (Thread/Process) ✅ ✅ ✅ ✅
Zero-config Persistence ✅ (SQLite default) ❌ (Needs Broker) ✅ ❌ (Needs Broker)
Broker-backend execution ❌ (roadmap) ✅ ❌ ✅

When to Choose Jobify

Use Jobify when:

  • you need precise in-process scheduling without polling overhead
  • you want typed, framework-like APIs for task registration and routing
  • you need queue-based backpressure and priority controls in a single process

License

This project is licensed under the MIT license.

Metadata

Release files for jobify 0.13.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for jobify 0.13.0
File Size Uploaded
jobify-0.13.0.tar.gz 44.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for jobify 0.13.0
File Interpreter ABI Platform
jobify-0.13.0-py3-none-any.whl Python 3 none any Details

Total release size: 109.8 kB

Release files / jobify-0.13.0.tar.gz

Download URL jobify-0.13.0.tar.gz
Size 44.9 kB
Tags Source
SHA-256 checksum
How to use checksums
ee306cc98ccecb48034a4494d78124928a2dd372cb87fd45ce9510b43e7e339a
BLAKE2b-256 checksum
How to use checksums
7ab786927d1a3517dbaf1703ceaa141ca1e90105da6f02faf3de75030eef1cce
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.11.19 {"installer":{"name":"uv","version":"0.11.19","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}

Release files / jobify-0.13.0-py3-none-any.whl

Download URL jobify-0.13.0-py3-none-any.whl
Size 64.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
47274d7c669dcceeb733cb37c7ebd13f7a029ea559fba9df57e34c090516b407
BLAKE2b-256 checksum
How to use checksums
cd89fc9007128807aa50258defc0cb2cfc2e4b06103b83b002df0f0413ab1c4c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.11.19 {"installer":{"name":"uv","version":"0.11.19","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}

Release history Release notifications | RSS feed

This release

0.13.0 This release

2 release files

0.12.1

2 release files

0.11.0

2 release files

0.10.0

2 release files

0.9.2

2 release files

0.9.1

2 release files

0.9.0

2 release files

0.8.1

2 release files

0.8.0

2 release files

0.7.1

2 release files

0.7.0

2 release files

0.6.1

2 release files

0.6.0

2 release files

0.5.2

2 release files

0.5.1

2 release files

0.5.0

2 release files

0.4.0

2 release files

0.3.3

2 release files

0.3.2

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.2

2 release files

0.1.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page