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 broker/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 ../../broker/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.0.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.0-py3-none-any.whl (18.2 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: chopflow-0.1.0.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.0.tar.gz
Algorithm Hash digest
SHA256 2a35087b763d9589d93bf35e4c8fa82aea8d3e150887da345f53cc5e5ac5d898
MD5 b4a2d0ecb921cb9484a293bcde60add2
BLAKE2b-256 1285b69e42c225c39c01741dc49f622191ed548a0b7b4e600fc738e4218a4f5c

See more details on using hashes here.

Provenance

The following attestation bundles were made for chopflow-0.1.0.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.0-py3-none-any.whl.

File metadata

  • Download URL: chopflow-0.1.0-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.0-py3-none-any.whl
Algorithm Hash digest
SHA256 869131bd465a5405b477c81aa89de5b737229e8370217d6f879a9ce2bf22fdb8
MD5 a29a9a8923c621a9155a9c6962364cb8
BLAKE2b-256 47e5623758ba8e23c46c1c2dd629c106afa46a8720d0f41fda4d31c890b3024c

See more details on using hashes here.

Provenance

The following attestation bundles were made for chopflow-0.1.0-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

0.1.1

2 files

This release

0.1.0 This release

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