Skip to main content

Add your description here

Project description

AsyncNode

AsyncNode is a Python asynchronous computation wrapper that allows you to create, chain, combine, and execute asynchronous computations flexibly, optionally using executors for CPU-bound or IO-bound tasks. It supports wrapping synchronous and asynchronous computations, chaining operations using map, run, consume, combining multiple AsyncNode instances, handling exceptions synchronously or asynchronously, and lazy evaluation with caching. Schedulers is a centralized factory for executors that provides singleton-style access, meaning each executor instance (IO-bound, CPU-bound, or single-threaded) is created only once and reused throughout your application. Executors are lazily instantiated when first accessed.

You can create nodes from values, synchronous suppliers, or synchronous runnables, for example:

from async_node.async_node import AsyncNode

node1 = AsyncNode.from_value(10)
node2 = AsyncNode.from_supplier(lambda: 5)
node3 = AsyncNode.from_runnable(lambda: print("Task done"))

Nodes can be transformed using synchronous mapping functions:

node4 = node1.map(lambda x: x * 2)

or asynchronous mapping functions:

async def async_double(x):
    await asyncio.sleep(1)
    return x * 2

node5 = node2.map_async(async_double)

Side-effects can be run synchronously or asynchronously:

node1.run(lambda: print("Value computed"))

async def async_print():
    await asyncio.sleep(1)
    print("Async task completed")

node2.run_async(async_print)

Nodes can be combined using synchronous functions:

def combine_sum(a, b):
    return a + b

combined_node = node1.combine(node2, combine_function=combine_sum)

or asynchronous functions:

async def async_combine(a, b):
    await asyncio.sleep(1)
    return a + b

combined_async_node = node1.combine_async(node2, combine_function=async_combine)

Values can be consumed synchronously or asynchronously:

node1.consume(lambda x: print(f"Consumed value: {x}"))

async def async_consume(x):
    await asyncio.sleep(1)
    print(f"Consumed async: {x}")

node2.consume_async(async_consume)

Exceptions can be handled synchronously or asynchronously:

def handle_exception(e):
    print(f"Exception occurred: {e}")
    return 0

safe_node = node1.exceptionally(handle_exception)

async def async_handle_exception(e):
    print(f"Async exception: {e}")
    return 0

safe_node_async = node2.exceptionally_async(async_handle_exception)

Executors can be used via Schedulers, and they are singleton, so each call returns the same instance:

from async_node.schedulers import Schedulers

io_executor = Schedulers.io()  # singleton IO-bound executor
cpu_executor = Schedulers.computation()  # singleton CPU-bound executor
single_executor = Schedulers.single()  # singleton single-thread executor

node_with_executor = node1.on(cpu_executor)
node_on_main = node_with_executor.on_main_thread()

Worker timeouts can be configured before executors are created:

Schedulers.set_workers_timeout(30)  # seconds

Finally, results are retrieved asynchronously:

import asyncio

async def main():
    result = await node1.get()
    print(result)

asyncio.run(main())

AsyncNode makes it easy to manage asynchronous workflows in Python, supporting both synchronous and asynchronous functions, chaining, combination, exception handling, and optional executor usage, with lazy evaluation and caching for efficiency. Schedulers simplifies managing and reusing singleton executors for IO-bound, CPU-bound, or single-threaded tasks, ensuring optimal performance across different computation types.

Project details


Download files

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

Source Distribution

async_node-1.0.4.tar.gz (10.0 kB view details)

Uploaded Source

Built Distribution

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

async_node-1.0.4-py3-none-any.whl (10.4 kB view details)

Uploaded Python 3

File details

Details for the file async_node-1.0.4.tar.gz.

File metadata

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

File hashes

Hashes for async_node-1.0.4.tar.gz
Algorithm Hash digest
SHA256 dc8e7f9148e4df4b09bfbca1bb8878b52b985f7433f5b48af51262e78210ede1
MD5 130dea13a3649ffe18749a43e9094e80
BLAKE2b-256 13c41a5b9934f2ca31f8c32abc6dfce62b071e8bbf1be3c763bcb8efb645da03

See more details on using hashes here.

Provenance

The following attestation bundles were made for async_node-1.0.4.tar.gz:

Publisher: python-publish.yml on Lorenzo-Gardini/async-node

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

File details

Details for the file async_node-1.0.4-py3-none-any.whl.

File metadata

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

File hashes

Hashes for async_node-1.0.4-py3-none-any.whl
Algorithm Hash digest
SHA256 e35af381aa1bfbc5f5443d7ebeb60499f7c3340469d2f9ba82e4655aa5bddf8d
MD5 44da761eb55302b585f27056a725df2b
BLAKE2b-256 a5e149e266c3a7874666aecfdbb3f7dee4e9f138f5b06c2a61c728090bd40bdf

See more details on using hashes here.

Provenance

The following attestation bundles were made for async_node-1.0.4-py3-none-any.whl:

Publisher: python-publish.yml on Lorenzo-Gardini/async-node

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