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.
Metadata
Release files for grafo 0.3.6
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.6.tar.gz | 20.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| grafo-0.3.6-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 32.8 kB
Release files / grafo-0.3.6.tar.gz
| Download URL | grafo-0.3.6.tar.gz |
|---|---|
| Size | 20.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
9d139eec771a62c2b6690c3b0aed0b02e8c63a58cbe506dac5942aae045437e4
|
|
BLAKE2b-256 checksum How to use checksums |
1631a466f6f875d1896024848fa1c6f4b74d992e132486d87d066dbce0cae012
|
| 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.6-py3-none-any.whl
| Download URL | grafo-0.3.6-py3-none-any.whl |
|---|---|
| Size | 12.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e4c36f88088d10177c41e3a251a79b66efc8092978df4ebbdeb965a44898d024
|
|
BLAKE2b-256 checksum How to use checksums |
ab78da8264e9f84c144752520bcb513eda39e97d793b44b04d91ba0360d40ab9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.9.25
|