Skip to main content

Capture the result of a Trio or anyio task

Project description

Welcome to aioresult!

This is a very small library to capture the result of an asynchronous operation, either an async function (with the ResultCapture class) or more generally (with the Future class). It works with Trio nurseries and anyio task groups. It does not work with vanilla asyncio task groups, but I wouldn’t recommend using those (see Trio vs asyncio).

Quick Overview

The ResultCapture class runs an async function in a nursery and stores its return value (or raised exception) for later:

async with trio.open_nursery() as n:
    result1 = ResultCapture.start_soon(n, foo, 1)
    result2 = ResultCapture.start_soon(n, foo, 2)
# At this point the tasks have completed, and results are stashed in ResultCapture objects
print("results", result1.result(), result2.result())

When stored in a list, the effect is very similar to the asyncio gather() function:

async with trio.open_nursery() as n:
    results = [ResultCapture.start_soon(n, foo, i) for i in range(10)]
print("results:", *[r.result() for r in results])

There is also a simple Future class that shares a lot of its code with ResultCapture. The result is retrieved the same way, but it is set explicitly rather than captured from a task. It is most often used when an API wants to return a value that will be demultiplexed from a shared connection:

# When making a request, create a future, store it for later and return to caller
f = aioresult.Future()

# The result is set, usually inside a networking API
f.set_result(result)

# The calling code can wait for the result then retrieve it
await f.wait_done()
print("result:", f.result())

The interface in Future and ResultCapture to wait for a result and retrieve it is shared in a base class ResultBase.

There are also a few simple utility functions to help waiting for results: wait_any() and wait_all() to wait for one or all of a collection of tasks to complete, and results_to_channel() to allow using the results as they become available.

Installation and Usage

Install into a suitable virtual environment with pip:

pip install aioresult

aioresult can be used with Trio nurseries:

import trio
from aioresult import ResultCapture

async def wait_and_return(i):
    await trio.sleep(i)
    return i

async def use_aioresult():
    async with trio.open_nursery() as n:
        results = [ResultCapture.start_soon(n, wait_and_return, i) for i in range(5)]
    print("results:", *[r.result() for r in results])

if __name__ == "__main__":
    trio.run(use_aioresult)

It can also be used with anyio task groups:

import asyncio
import anyio
from aioresult import ResultCapture

async def wait_and_return(i):
    await anyio.sleep(i)
    return i

async def use_aioresult():
     async with anyio.create_task_group() as tg:
         results = [ResultCapture.start_soon(tg, wait_and_return, i) for i in range(5)]
     print("results:", *[r.result() for r in results])

if __name__ == "__main__":
    asyncio.run(use_aioresult())

Contributing

This library is deliberately small and limited in scope, so it is essentially “done” (but you never know).

To test any changes, install the test requirements (see the pyproject.toml file) and run pytest in the root of the repository:

python -m pytest

To also get coverage information, run it with the coverage command:

coverage run -m pytest

You can then use coverage html to get a nice HTML output of exactly what code has been tested and what has been missed.

To run the type tests, run pyright or mypy in the project root directory. You may need to install the excetiongroup compatibility package, even on newer versions of Python.

License

Copyright Arthur Tacca 2022 - 2025

Distributed under the Boost Software License, Version 1.0. See accompanying file LICENSE or the copy at https://www.boost.org/LICENSE_1_0.txt

This is similar to other liberal licenses like MIT and BSD: you can use this library without the need to share your program’s source code, so long as you provide attribution of aioresult.

The Boost license has the additional provision that you do not even need to provide attribution if you are distributing your software in binary form only, e.g. if you have compiled to an executable with Nuitka. (Bundlers like pyinstaller, py2exe and pex don’t count for this because they still include the source code internally.)

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

aioresult-1.2.tar.gz (19.9 kB view details)

Uploaded Source

Built Distribution

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

aioresult-1.2-py3-none-any.whl (15.1 kB view details)

Uploaded Python 3

File details

Details for the file aioresult-1.2.tar.gz.

File metadata

  • Download URL: aioresult-1.2.tar.gz
  • Upload date:
  • Size: 19.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.10.13

File hashes

Hashes for aioresult-1.2.tar.gz
Algorithm Hash digest
SHA256 627c9f452e851d71635fb1d88ce9c0ad371f112eadd33f1753b2469f645f3003
MD5 361b86bca75da5c8daac08e667c0f993
BLAKE2b-256 8587e0e610a43b1f2f3f415b83459bb8f92da0097dcc42b8f99de0aedea9b801

See more details on using hashes here.

File details

Details for the file aioresult-1.2-py3-none-any.whl.

File metadata

  • Download URL: aioresult-1.2-py3-none-any.whl
  • Upload date:
  • Size: 15.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.10.13

File hashes

Hashes for aioresult-1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 cc9bb4854885acd6eefdf91ceb5e07e9f7b176039136b1058e9303ed7f1f5223
MD5 3cab00a65810837ed0ff73204012091a
BLAKE2b-256 6b4a0bd4b115aee22e26c7cc7d2f2075d7be39447cf62e4628bcf13f68c286b0

See more details on using hashes here.

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