Skip to main content

ChopFlow Python Client

A Python worker + producer SDK for ChopFlow, the distributed task queue in Rust. The broker and all execution logic live in Rust; this SDK lets you define and run task handlers in Python and enqueue tasks from Python, speaking gRPC to the broker over the contract in proto/proto/chopflow.proto.

Build status: Verified — pytest passes (Python 3.12 + grpcio 1.83) and the examples round-trip end-to-end against the Rust broker (Python producer enqueues an echo task → Python worker acks → AsyncResult.get() returns COMPLETED).

Requirements

  • Python 3.10+
  • The Rust broker binary (chopflow_broker) running somewhere reachable. Build it with cargo build -p chopflow_broker from the repo root.

Install

The SDK is not yet published to PyPI; install it editable from source:

cd clients/python
python -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"

The generated gRPC stubs (src/chopflow/_generated/) are committed, so no protoc toolchain is required to install or use the SDK. Regenerate them only when the proto changes:

python generate.py        # reads ../../proto/proto/chopflow.proto

Usage

Worker — define and run handlers in Python

from chopflow import ChopFlowWorker, task


@task("resize_image")
def resize(payload):
    # ...your logic; return something JSON-serializable...
    return {"status": "ok", "resized": payload}


worker = (
    ChopFlowWorker.builder()
    .broker("localhost:8000")
    .tags("image")
    .resources("cpu", 2)
    .build()
)
# `resize_image` was registered via the @task decorator above.
worker.register("ping", lambda p: {"pong": True})  # or register callables directly
worker.start_and_await()  # blocks until Ctrl+C

The worker registers with the broker, sends heartbeats, polls FetchTasks, executes the matching handler, and acknowledges each task. A handler that raises is acked as a failure and the broker applies its retry/dead-letter policy. Tasks with no registered handler fall back to the worker's default handler (override via worker.register_default(...)).

Producer — enqueue tasks and await results

from chopflow import ChopFlowClient

with ChopFlowClient.connect("localhost:8000") as client:
    result = (
        client.enqueue("resize_image")
        .payload({"path": "/img/a.png", "w": 128})
        .tags("image")
        .max_retries(2)
        .priority(5)  # higher = claimed before lower (default 0)
        .enqueue()
    )
    task = result.get(timeout=60)  # blocks until terminal
    print(task.status_name, task.result)

AsyncResult.get() polls GetTaskStatus until the task reaches a terminal state (COMPLETED, FAILED, DEADLETTERED, CANCELLED). By default it raises TaskFailedError if the task did not complete; pass raise_on_failure=False to get the terminal Task back instead. It raises TaskTimeoutError if the deadline elapses.

Schedules

from chopflow import ChopFlowClient
from chopflow.models import OverlapPolicy

with ChopFlowClient.connect("localhost:8000") as client:
    sid = client.create_cron_schedule(
        "nightly", "build", "0 9 * * *", tags=["ci"], overlap=OverlapPolicy.OVERLAP_SKIP
    )
    print(client.list_schedules())
    client.delete_schedule(sid)

Examples

  • examples/producer.py — enqueue an echo task and print the result.
  • examples/echo_worker.py — register an echo handler and run until Ctrl+C.

Tests

cd clients/python
pip install -e ".[dev]"
pytest                    # builds the broker once, then runs 14 integration tests

The test suite builds the Rust broker on an ephemeral port with in-memory storage and exercises the full SDK: enqueue/get, polling, cancellation, failure dead-lettering, schedule CRUD, and worker handler dispatch.

Download files

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

Source Distribution

chopflow-0.1.1.tar.gz (20.0 kB view details)

Uploaded Source

Built Distribution

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

chopflow-0.1.1-py3-none-any.whl (18.2 kB view details)

Uploaded Python 3

File details

Details for the file chopflow-0.1.1.tar.gz.

File metadata

  • Download URL: chopflow-0.1.1.tar.gz
  • Upload date:
  • Size: 20.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for chopflow-0.1.1.tar.gz
Algorithm Hash digest
SHA256 a602212e7c041bee47f4e9652415a51ca899982ebc68a186ad6456965789be96
MD5 2ddbca7224287839adb3cfe274796e4a
BLAKE2b-256 a6eb862eb9e93e8486648f733c0b9c217fa5f672e3cf92bf89c0e14b29ebe277

See more details on using hashes here.

Provenance

The following attestation bundles were made for chopflow-0.1.1.tar.gz:

Publisher: release.yml on ricardoleal20/ChopFlow

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file chopflow-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: chopflow-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 18.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for chopflow-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 480118be6401ea98e05eb40d36b6a5114870983da2fa22bf6230e99b10e7aabf
MD5 f8a4398778beabc3164105e85916ace0
BLAKE2b-256 903fd50fc296d32b3f7362265d8094118bd051e52a1a8f72ad5d71c1442135dd

See more details on using hashes here.

Provenance

The following attestation bundles were made for chopflow-0.1.1-py3-none-any.whl:

Publisher: release.yml on ricardoleal20/ChopFlow

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

0.1.1 This release

2 files

0.1.0

2 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