Skip to main content

Chicory

Lightweight, async-native job queue for Python

Merge Gate - Full Tests


Documentation: https://chicory-dev.github.io/chicory

Source Code: https://github.com/chicory-dev/chicory


Chicory is a modern, async-first task queue for Python that makes distributed task execution simple and reliable. Built from the ground up with Python's async/await syntax, Chicory provides a clean, type-safe API for managing background jobs.

Key Features

  • Async Native - Built with Python's asyncio from day one
  • Type Safe - Full type hints with automatic input/output validation via Pydantic
  • Multiple Brokers - Support for Redis and RabbitMQ message brokers
  • Multiple Backends - Store results in Redis, PostgreSQL, MySQL, SQLite, or MS SQL Server
  • Flexible Delivery - Choose between at-least-once and at-most-once delivery guarantees
  • Smart Retries - Built-in retry policies with exponential backoff
  • Simple CLI - Easy worker management with the included CLI tool
  • Production Ready - Designed for reliability and performance at scale

Requirements

Python 3.11+

Chicory is built on these excellent libraries:

Installation

=== "Basic Installation"

```console
$ pip install chicory
```

=== "With Redis"

```console
$ pip install chicory[redis]
```

=== "With RabbitMQ"

```console
$ pip install chicory[rabbitmq]
```

=== "With PostgreSQL"

```console
$ pip install chicory[postgres]
```

=== "With CLI"

```console
$ pip install chicory[cli]
```

=== "Everything"

```console
$ pip install chicory[all]
```

Quick Start

1. Define Your Tasks

Create a file tasks.py:

from chicory import Chicory, BrokerType, BackendType

# Initialize Chicory with Redis broker and backend
app = Chicory(
    broker=BrokerType.REDIS,
    backend=BackendType.REDIS,
)

@app.task()
async def send_email(to: str, subject: str, body: str) -> dict:
    """Send an email asynchronously."""
    # Your email sending logic here
    await asyncio.sleep(1)  # Simulate work
    return {
        "status": "sent",
        "to": to,
        "subject": subject,
    }

@app.task()
async def process_data(data: dict) -> dict:
    """Process some data."""
    # Your data processing logic
    result = {
        "processed": True,
        "items": len(data.get("items", [])),
    }
    return result

2. Start a Worker

Run workers to process tasks:

$ chicory worker tasks:app

Or programmatically:

from chicory import Worker

async def main():
    worker = Worker(app)
    await worker.start()

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

3. Dispatch Tasks

From your application code:

import asyncio
from tasks import app, send_email, process_data

async def main():
    # Connect to broker and backend
    await app.connect()

    try:
        # Dispatch a task and wait for result
        result = await send_email.delay(
            to="user@example.com",
            subject="Welcome!",
            body="Thanks for signing up!",
        )

        # Get the result (waits until task completes)
        email_result = await result.get(timeout=30.0)
        print(f"Email sent: {email_result}")

        # Fire-and-forget (don't wait for result)
        task_id = await process_data.send({"items": [1, 2, 3]})
        print(f"Task dispatched: {task_id}")

    finally:
        await app.disconnect()

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

That's it! You now have a fully functional distributed task queue.

Why Chicory?

Designed for Modern Python

Chicory embraces Python's async capabilities from the start. No callbacks, no threading complexity—just clean async code:

@app.task()
async def fetch_user_data(user_id: int) -> dict:
    async with httpx.AsyncClient() as client:
        response = await client.get(f"https://api.example.com/users/{user_id}")
        return response.json()

# Dispatch and await
result = await fetch_user_data.delay(123)
data = await result.get()

Type-Safe by Default

Automatic validation of inputs and outputs using Pydantic:

from pydantic import BaseModel, EmailStr

class EmailData(BaseModel):
    to: EmailStr
    subject: str
    body: str

@app.task()
async def send_email(data: EmailData) -> dict:
    # data is automatically validated
    # Invalid input raises ValidationError before task is queued
    ...

# This validates the input immediately
await send_email.delay(EmailData(
    to="user@example.com",
    subject="Hello",
    body="World"
))

Flexible and Scalable

Choose the right tools for your needs:

  • Brokers: Redis or RabbitMQ
  • Backends: Redis, PostgreSQL, MySQL, SQLite, MS SQL Server
  • Delivery Modes: At-least-once or at-most-once
  • Validation Modes: Strict, inputs-only, outputs-only, or disabled

Scale from a single process to hundreds of workers across multiple machines.

Production-Ready Features

Built-in support for:

  • Automatic retries with exponential backoff
  • Task context for accessing task metadata
  • Worker lifecycle hooks for setup/teardown
  • Dead-letter queues for failed tasks
  • Task timeouts and cancellation
  • Graceful shutdown with configurable drain periods

Comparison with Celery

Feature Chicory Celery
Async/Await Native support No support
Type Hints Full support with validation Limited
Python Version 3.11+ 3.8+
Performance Optimized for async Thread/process based

Chicory is not a drop-in replacement for Celery, but if you're starting a new async Python project, Chicory provides a more modern and Pythonic experience.

Documentation

For detailed documentation, visit https://chicory-dev.github.io/chicory

  • Tutorial: Step-by-step guides for common use cases
  • User Guide: In-depth documentation of all features
  • API Reference: Complete API documentation

Contributing

Contributions are welcome!

License

This project is licensed under the MIT License - see the LICENSE file for details.

Credits

Chicory is built and maintained by:

Inspired by the excellent work of the Celery and FastAPI projects.

Release files for chicory 0.1.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 chicory 0.1.0
File Size Uploaded
chicory-0.1.0.tar.gz 38.4 kB Details

Built distribution (wheel)

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

Total release size: 86.6 kB

Release files / chicory-0.1.0.tar.gz

Download URL chicory-0.1.0.tar.gz
Size 38.4 kB
Tags Source
SHA-256 checksum
How to use checksums
e7205c618038774a86567b521d398cb970be027808c761accbdf3a7f4c160439
BLAKE2b-256 checksum
How to use checksums
be90167db46732874c25186ce474bd3f380fa3e6d48033dac89e5438adac2f2d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.10.7 {"installer":{"name":"uv","version":"0.10.7","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 / chicory-0.1.0-py3-none-any.whl

Download URL chicory-0.1.0-py3-none-any.whl
Size 48.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
51da70471ca031655c59c8ee867e7c06d28f5b89dfaa341e2bc9abf47c02521f
BLAKE2b-256 checksum
How to use checksums
b3809ae701a9924c8f8f6092ca81fbfb411e8705b7a4c220e4878e35a0b131d2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.10.7 {"installer":{"name":"uv","version":"0.10.7","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.1.0 This release

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