Skip to main content

Distributed Async Await by Resonate HQ, Inc

Project description

resonate banner

Resonate Python SDK

ci codecov License

About this component

The Resonate Python SDK enables developers to build reliable and scalable cloud applications across a wide variety of use cases.

Requirements

  • Python ≥3.12
  • Resonate Server: The Python SDK works with the latest Resonate server (v0.9.x and up).

Quickstart

quickstart banner

  1. Install the Resonate Server & CLI
brew install resonatehq/tap/resonate
  1. Install the Resonate SDK
pip install resonate-sdk
  1. Write your first Resonate Function

A countdown as a loop. Simple, but the function can run for minutes, hours, or days, despite restarts.

import asyncio
from datetime import timedelta

from resonate.context import Context
from resonate.resonate import Resonate


async def countdown(ctx: Context, count: int, delay: int) -> None:
    for i in range(count, 0, -1):
        # Run a function durably, awaiting its persisted result
        await ctx.run(ntfy, i)
        # Sleep durably -- the worker holds no state while suspended
        await ctx.sleep(timedelta(seconds=delay))
    print("Done!")


async def ntfy(ctx: Context, i: int) -> None:
    print(f"Countdown: {i}")


async def main() -> None:
    # Connect to the Resonate server and register the functions
    resonate = Resonate(url="http://localhost:8001")
    resonate.register(countdown)
    resonate.register(ntfy)

    try:
        # Invoke with execution id "countdown.1"; run() returns a handle
        # immediately, result() awaits the durable outcome
        handle = resonate.run("countdown.1", countdown, 5, 1)
        await handle.result()
    finally:
        await resonate.stop()


if __name__ == "__main__":
    asyncio.run(main())
  1. Start the server
resonate dev
  1. Run the worker
python countdown.py

Result

You will see the countdown in the terminal

python countdown.py
Countdown: 5
Countdown: 4
Countdown: 3
Countdown: 2
Countdown: 1
Done!

What to try

While the function is running, inspect the current state of the execution using the resonate tree command. The tree command visualizes the call graph of the function execution as a graph of durable promises.

resonate tree countdown.1

Now try killing the worker mid-countdown and restarting python countdown.py. Because the invocation id is the same (countdown.1), the worker reattaches to the existing durable promise and the countdown picks up right where it left off without missing a beat.

Examples

The examples/ directory contains runnable programs covering the core patterns. Start a server (resonate dev) on localhost:8001, then run any of them, for example:

uv run python examples/hello-world
uv run python examples/fibonacci --mode rpc --n 10
Example What it shows
hello-world A minimal ctx.run / ctx.rpc chain
fibonacci Recursive durable invocations via run, rpc, or a mix
pipeline A multi-stage DAG with stages running in parallel
structured-concurrency The runtime never leaks an unawaited durable child
recovery Typed serialize/deserialize across the durability boundary
retries Resonate retrying a flaky leaf function until it succeeds
error-handling How a failure crosses the boundary and is re-raised
detached Fire-and-forget invocations decoupled from the parent
human-in-the-loop Suspending on a promise an external party resolves
polling Non-blocking progress tracking with handle.done()
rpc One worker dispatching to another by group
versioning Running several versions of one function side by side
saga Compensating completed steps when a later step fails

Project details


Release history Release notifications | RSS feed

Download files

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

Source Distribution

resonate_sdk-0.7.3.tar.gz (73.7 kB view details)

Uploaded Source

Built Distribution

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

resonate_sdk-0.7.3-py3-none-any.whl (86.0 kB view details)

Uploaded Python 3

File details

Details for the file resonate_sdk-0.7.3.tar.gz.

File metadata

  • Download URL: resonate_sdk-0.7.3.tar.gz
  • Upload date:
  • Size: 73.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for resonate_sdk-0.7.3.tar.gz
Algorithm Hash digest
SHA256 012ba690da514d85bdfcb512fb9e986beccae402cc6e3e9664dd929727e6b20d
MD5 fbdd19398f2a68e177646db6edef714b
BLAKE2b-256 7449bd019bcf34de792d351dc093188d9b68a1b532ff7c2efc59e5ff2913e494

See more details on using hashes here.

Provenance

The following attestation bundles were made for resonate_sdk-0.7.3.tar.gz:

Publisher: cd.yml on resonatehq/resonate-sdk-py

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

File details

Details for the file resonate_sdk-0.7.3-py3-none-any.whl.

File metadata

  • Download URL: resonate_sdk-0.7.3-py3-none-any.whl
  • Upload date:
  • Size: 86.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for resonate_sdk-0.7.3-py3-none-any.whl
Algorithm Hash digest
SHA256 693f8f5c12b22bb3f480680b1f8002898aab0b528f5d3f6c475f970910b851c4
MD5 38a9b6bfece3288f205108b43cdb677b
BLAKE2b-256 aab6e6cc07895505f00c4b1bfaf19e1ec9b9925bf472eb7894be233769a7a1c3

See more details on using hashes here.

Provenance

The following attestation bundles were made for resonate_sdk-0.7.3-py3-none-any.whl:

Publisher: cd.yml on resonatehq/resonate-sdk-py

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

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