Bounded-concurrency execution of DAG-shaped async workflows for without, liftable into a Processor.
Project description
without-dag
Concurrent execution of DAG-shaped async workflows, liftable into a without
Processor. A Processor[In, Out] is otherwise an opaque stream-to-stream
closure; this package lets the inside of a per-event step be a graph of async
sub-steps that run with bounded concurrency and recombine into one output. It is
the value-level fan-out/fan-in the substrate leaves room for: one input value
drives many concurrent computations.
Graph is the typed frontend: a builder that threads value types through the
wiring so a mismatched dependency is a mypy error and a cycle is unrepresentable.
It compiles once into a CompiledGraph, an async callable reused per event:
from without_dag import Graph
async def fetch(request: Request) -> Fetched: ...
async def parse(fetched: Fetched) -> Parsed: ...
async def render(fetched: Fetched, parsed: Parsed) -> Report: ...
graph, (request,) = Graph.of(Request)
fetched = graph.node(fetch, request)
parsed = graph.node(parse, fetched)
report = graph.node(render, fetched, parsed)
run = graph.build(output=report, limit=4)
result: Report = await run(some_request)
Each node runs once (memoized, so a diamond's shared ancestor executes a single
time with no glitch), acyclicity is proven at the boundary via stdlib
graphlib, and a single-input graph is an async (In) -> Out callable, exactly
what from_map lifts into a Processor.
See the
without-dag guide
(with the API reference)
for the full surface: the object-seam execution core (Plan, drive,
evaluate), the typed frontend, and lifting into a processor.
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file without_dag-0.0.1.tar.gz.
File metadata
- Download URL: without_dag-0.0.1.tar.gz
- Upload date:
- Size: 6.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.26 {"installer":{"name":"uv","version":"0.11.26","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}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
77e43f28a20e719fe4248acbc2079994185bb949bcb47a5f056ccd5c4d5e6fd9
|
|
| MD5 |
527eb56f607e52df243a9f0f9c81be8f
|
|
| BLAKE2b-256 |
6502b38c410a800b2ed2e93032314c98b0d67617efb78960ffeb424b7bff0062
|
File details
Details for the file without_dag-0.0.1-py3-none-any.whl.
File metadata
- Download URL: without_dag-0.0.1-py3-none-any.whl
- Upload date:
- Size: 8.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.26 {"installer":{"name":"uv","version":"0.11.26","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}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7c14ede45e52297b88dce32c2d1fd457b0a6c5adeb24d4b1b1d3ff7278652d91
|
|
| MD5 |
8b2e23a7aef6573be328ff173aaf966b
|
|
| BLAKE2b-256 |
b13b332a34da79258808805ddb3974b790372f6672edc84429325abecb9e9dcb
|