A simple library for building runnable async trees. Trees are a web of interconnected Nodes, which contain code to be run. A node can only start executing once all its parents have finished running.
Features
- The number of workers is automatically managed - although you can parametrize this
- Trees can have any shape - including multiple roots - and can be dynamically altered during their runtime
- State can be passed between nodes manually (as lambda functions) or via forwarding
- Yielding coroutines produce
Chunkobjects that wrap intermediate results with the node's UUID
Installation
pip install grafoto install on your environmentpytestto run tests, add-sflag for tests to runprintstatements
Use
Basic tree execution
async def my_coroutine():
return "result"
root_node = Node(coroutine=my_coroutine, uuid="root")
child_node = Node(coroutine=my_coroutine, uuid="child")
await root_node.connect(child_node)
executor = TreeExecutor(uuid="My Tree", roots=[root_node])
result = await executor.run()
Yielding intermediate results
async def yielding_coroutine():
for i in range(3):
yield f"progress {i}"
yield "completed"
node = Node(coroutine=yielding_coroutine)
executor = TreeExecutor(roots=[node])
async for item in executor.yielding():
if isinstance(item, Node):
print(f"Node {item.uuid} completed")
else: # Chunk
print(f"Intermediate: {item.output}")
Evaluating coroutine kwargs during runtime (manual forwarding)
node = Node(coroutine=my_coroutine, kwargs=dict(my_arg=lambda: get_dynamic_value()))
Forwarding output between nodes (automatic forwarding)
async def producer():
return "data"
async def consumer(data: str):
return f"processed_{data}"
node_a = Node(coroutine=producer, uuid="producer")
node_b = Node(coroutine=consumer, uuid="consumer")
await node_a.connect(node_b, forward="data")
# node_b will receive node_a's output as the 'data' argument
Type validation with generics
node = Node[str](coroutine=my_string_coroutine)
# The node will validate that the coroutine returns a string
Documentation
Full documentation is available at https://paulomtts.github.io/grafo/
To build the documentation locally:
pip install mkdocs mkdocs-material "mkdocstrings[python]"
mkdocs serve
Then visit http://localhost:8000
Developer's Zen
- Follow established nomenclature: a Node is a Node.
- Syntax sugar is sweet in moderation.
- Give the programmer granular control.
Release files for grafo 0.3.5
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| grafo-0.3.5.tar.gz | 19.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| grafo-0.3.5-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 31.6 kB
Release files / grafo-0.3.5.tar.gz
| Download URL | grafo-0.3.5.tar.gz |
|---|---|
| Size | 19.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
211a1c0d62a4eaaa01092af16246872f44a3c88fc67657ed0d22cc0e025ef359
|
|
BLAKE2b-256 checksum How to use checksums |
b1adb38fb9bd732ce0e0aa6f3552ae8723fc762b08592e8b071d6ee607a5644d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.9.25
|
Release files / grafo-0.3.5-py3-none-any.whl
| Download URL | grafo-0.3.5-py3-none-any.whl |
|---|---|
| Size | 12.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
9f328aae11ec560bb3eac5a8d9e2074110dce7f7fbbf640dc1955cee08f4211c
|
|
BLAKE2b-256 checksum How to use checksums |
d9560a1fe355296160ccd6895a086717f11a235917c15f899ce35052887b5d0f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.9.25
|