durable-python
Make Python async functions durable and resumable with a minimal, pluggable runtime.
Overview
This package treats durability as a core runtime concern. Async functions are transformed into a sequence of CodeBlocks that can be checkpointed, paused, and resumed through a DurableRuntime. Everything is open and pluggable: orchestration backends implement a small interface, and persistence is provided through StateStore implementations.
Key primitives:
DurableRuntime— drives execution and persistence.CallStack/FunctionCall/CodeBlock— durable execution model.OrchestrationBackend/DurableBackend— orchestration + event waiting.StateStore/InMemoryStateStore/DiskStateStore— persistence.DurableAstTransformer/make_durable— transform async functions into durable programs.
Quick Start
import asyncio
from durable import DurableBackend, InMemoryStateStore, PauseForEventException, make_durable
# Define your async function
async def greet(name: str):
print("waiting for permission to greet")
raise PauseForEventException("allow")
return f"hello {name}"
# Make it durable
durable_greet = make_durable(greet)
async def main():
backend = DurableBackend(InMemoryStateStore())
async def run_once():
# Triggers runtime execution; will pause on PauseForEventException
try:
return await durable_greet("Ada", orchestration_backend=backend, instance_id="greet-1")
except PauseForEventException as e:
print(f"paused for event {e.event}")
await run_once() # pauses and persists state
backend.publish_event("greet-1", "allow") # deliver event
result = await durable_greet("Ada", orchestration_backend=backend, instance_id="greet-1")
print(result) # "hello Ada"
asyncio.run(main())
Architecture
- Execution model:
FunctionCallholds locals, an ordered list ofCodeBlocks, and the current index.CallStackorchestrates nested calls and return propagation. - Durable runtime:
DurableRuntimerestores saved state (if any), drives the call stack, and delegates persistence plus event waiting to anOrchestrationBackend. - Backends:
OrchestrationBackenddefinesload_state,save_state, andwait_for_event.DurableBackendis the OSS implementation backed by aStateStoreand an in-memory event bus. - Persistence:
StateStoredefinesload/save. The OSS package shipsInMemoryStateStoreandDiskStateStore(path). - Transformation:
DurableAstTransformerrewrites async functions into checkpointable code.make_durable(fn)wraps a function into aDurableProgramthat builds a runtime and executes it.
Custom Backends
Implement OrchestrationBackend to integrate with your own orchestration layer:
from durable import OrchestrationBackend
class CustomBackend(OrchestrationBackend):
async def load_state(self, instance_id: str) -> dict | None:
...
async def save_state(self, instance_id: str, state: dict) -> None:
...
async def wait_for_event(self, instance_id: str, event_name: str) -> None:
...
Use it by passing orchestration_backend= to the callable returned by make_durable.
Testing
Install dev dependencies and run pytest:
poetry install --with dev
poetry run pytest
Metadata
Release files for durable-python 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| durable_python-0.1.1.tar.gz | 14.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| durable_python-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 30.2 kB
Release files / durable_python-0.1.1.tar.gz
| Download URL | durable_python-0.1.1.tar.gz |
|---|---|
| Size | 14.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
0f58caf4b8da316fb36f5e618dcee77f7745900adef8fbce7defb60a0e5ca73b
|
|
BLAKE2b-256 checksum How to use checksums |
f53a8b6920aff098c89b1fc06c127f3b821c25913a02102de118bedfbea5b529
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/2.1.4 CPython/3.13.5 Darwin/24.3.0
|
Release files / durable_python-0.1.1-py3-none-any.whl
| Download URL | durable_python-0.1.1-py3-none-any.whl |
|---|---|
| Size | 15.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
79521aba63bbe7540460ab9117bc2d07c632c4f0a09446294d75f19be56f7777
|
|
BLAKE2b-256 checksum How to use checksums |
3d0e60712b68bad5b99454a613c8f9dc0cd92d5bb9f98caadf5486c53db835a1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/2.1.4 CPython/3.13.5 Darwin/24.3.0
|