Skip to main content

Coroutines without an event loop

Project description

https://github.com/ntessore/coroutines/actions/workflows/test.yml/badge.svg https://codecov.io/gh/ntessore/coroutines/graph/badge.svg?token=A6L220NL3Y

This is a small package which provides tools to run async functions and generators without an asyncio event loop.

The coroutines module provides functions such as coroutines.run(), coroutines.gather(), and coroutines.sleep() that work just like their asyncio counterparts, but without scheduling any tasks in an external event loop. For example, the following code was adapted from the asyncio documentation:

import coroutines

async def factorial(name, number):
    f = 1
    for i in range(2, number + 1):
        print(f"Task {name}: Compute factorial({number}), currently i={i}...")
        await coroutines.sleep()  # CHANGED: no argument
        f *= i
    print(f"Task {name}: factorial({number}) = {f}")
    return f

async def main():
    # Schedule three calls *concurrently*:
    L = await coroutines.gather(
        factorial("A", 2),
        factorial("B", 3),
        factorial("C", 4),
    )
    print(L)

coroutines.run(main())

# Expected output:
#
#     Task A: Compute factorial(2), currently i=2...
#     Task B: Compute factorial(3), currently i=2...
#     Task C: Compute factorial(4), currently i=2...
#     Task A: factorial(2) = 2
#     Task B: Compute factorial(3), currently i=3...
#     Task C: Compute factorial(4), currently i=3...
#     Task B: factorial(3) = 6
#     Task C: Compute factorial(4), currently i=4...
#     Task C: factorial(4) = 24
#     [2, 6, 24]

The example produces the same result as the asyncio code by simply calling, suspending, and resuming the coroutines until they are completed. Practically, the only difference between the coroutines and asyncio examples is that coroutines.sleep() does not take an argument. Because there is no external event loop, a call to coroutines.sleep() cannot suspend the current chain of coroutines for a fixed amount of time, but only until it is resumed at the next iteration.

Running coroutines

coroutines.run(coro) #

Run a coroutine from synchronous code.

Suspending coroutines

awaitable coroutines.sleep() #

Suspend the current chain of coroutines, allowing another coroutine to run concurrently.

Concurrent execution

awaitable coroutines.gather(*aws) #

Run the given awaitables aws concurrently.

Returns a coroutine that loops over aws, resuming each awaitable in turn until it is suspended again or finished. Execution is suspended after each pass over aws, so that other coroutines can run while the result of gather() is being awaited.

The result of awaiting gather() is the aggregate list of awaited results from aws in the same order.

Creating awaitables

The coroutines module contains a number of helper functions that turn regular objects into awaitable variants of themselves.

awaitable coroutines.awaitable(obj=None) #

Create an awaitable variant of obj. Returns a coroutine that awaits coroutines.sleep() before returning obj.

awaitable coroutines.aiterable(iterable) #

Create an awaitable variant of an iterable. Returns an asynchronous generator that awaits coroutines.sleep() before each item in iterable.

awaitable coroutines.arange(stop) #
awaitable coroutines.arange(start, stop[, step])

Create an awaitable variant of range(). Returns an asynchronous generator that awaits coroutines.sleep() before each number.

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

coroutines-0.3.0.tar.gz (5.5 kB view details)

Uploaded Source

Built Distribution

coroutines-0.3.0-py3-none-any.whl (5.8 kB view details)

Uploaded Python 3

File details

Details for the file coroutines-0.3.0.tar.gz.

File metadata

  • Download URL: coroutines-0.3.0.tar.gz
  • Upload date:
  • Size: 5.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/4.0.2 CPython/3.11.7

File hashes

Hashes for coroutines-0.3.0.tar.gz
Algorithm Hash digest
SHA256 0f34c33bc226f13548e54ee9651714927a77a63c7541fad33a1be521f8091453
MD5 aec5854f49b2528c503347e1e67110dc
BLAKE2b-256 a40e5db27756953660d3a4e0cdf6c6536563975e51582daa1a2c28383e29e15b

See more details on using hashes here.

File details

Details for the file coroutines-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: coroutines-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 5.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/4.0.2 CPython/3.11.7

File hashes

Hashes for coroutines-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 dd1c2c110c99440b94627d265debcf2f3033cae7032d27fadb8ff8e7a5d3bd05
MD5 a1bb4791a71cf82cb8fef4cf719d7556
BLAKE2b-256 61f20715bdb6ce0c7723b8ccb8eff0de226f6fd6ec83f1baff271f587823d460

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page