Skip to main content

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

Jobify
Robust task scheduler for Python.

Supported Python versions Tests Coverage CodeQL Dependency Review PyPI version License: MIT


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 asyncio in 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, and ProcessPoolExecutor for 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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

jobify-0.7.0.tar.gz (30.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

jobify-0.7.0-py3-none-any.whl (46.8 kB view details)

Uploaded Python 3

File details

Details for the file jobify-0.7.0.tar.gz.

File metadata

  • Download URL: jobify-0.7.0.tar.gz
  • Upload date:
  • Size: 30.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.9.29 {"installer":{"name":"uv","version":"0.9.29","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

Hashes for jobify-0.7.0.tar.gz
Algorithm Hash digest
SHA256 eaa49bfe852b8532690e531a5b1c9bd272549cf0d3c8faf2b6a974eb664235ff
MD5 d33f6f9f31e14df36bda9f8089e6dc0e
BLAKE2b-256 18433d4f7b877b65822cb982a395cafdd3246f06036e19fb0731bbda1c2703c7

See more details on using hashes here.

File details

Details for the file jobify-0.7.0-py3-none-any.whl.

File metadata

  • Download URL: jobify-0.7.0-py3-none-any.whl
  • Upload date:
  • Size: 46.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.9.29 {"installer":{"name":"uv","version":"0.9.29","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

Hashes for jobify-0.7.0-py3-none-any.whl
Algorithm Hash digest
SHA256 ff75a4da82ed0a3cd249356ae2a7b929243a563d3b5884c975342a1afc9210b2
MD5 ab64279c1011ad2e7765c65689a33216
BLAKE2b-256 62822c014ffb32d68cb3ac61cf7e19f0b0cc12de4d4881f5a607080a78d2b0dd

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page