Skip to main content

Python asyncio tools for web service resilience.

Project description

dike

Python asyncio tools for web service resilience

Release Status CI Status codecov

Features

Concurrency limiting for asynchronous functions

The @limit_jobs decorator allows to limit the number of concurrent excecutions of a coroutine function. This can be useful for limiting queueing times or for limiting the load put onto backend services.

Example with an external web request using the httpx library:

import asyncio
import httpx
import dike


@dike.limit_jobs(limit=2)
async def web_request():
    async with httpx.AsyncClient() as client:
        response = await client.get("https://httpstat.us/200?sleep=100")
    return response


async def main():
    responses = await asyncio.gather(
        web_request(), web_request(), web_request(), return_exceptions=True
    )
    for r in responses:
        if isinstance(r, dike.TooManyCalls):
            print("too many calls")
        else:
            print(r)


asyncio.run(main())

The output shows that the first two requests succeed. The third one hits the concurrency limit:

<Response [200 OK]>
<Response [200 OK]>
too many calls

Mini-batching for asynchronous function calls

The @batch decorator groups function calls into batches and only calls the wrapped function with the aggregated input.

This is useful if the function scales well with the size of the input arguments but you're getting the input data in smaller bits, e.g. as individual HTTP requests.

Example:

import asyncio
import dike


@dike.batch(target_batch_size=3, max_waiting_time=10)
async def f(arg1, arg2):
    print(f"arg1: {arg1}")
    print(f"arg2: {arg2}")
    return [10, 11, 12]


async def main():
    result = await asyncio.gather(
        f([0], ["a"]),
        f([1], ["b"]),
        f([2], ["c"]),
    )

    print(f"Result: {result}")


asyncio.run(main())

Output:

arg1: [0, 1, 2]
arg2: ['a', 'b', 'c']
Result: [[10], [11], [12]]

Installation

Simply install from pypi. The library is pure Python without any dependencies other than the standard library.

pip install dike

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

dike-0.2.0.tar.gz (12.3 kB view hashes)

Uploaded Source

Built Distribution

dike-0.2.0-py3-none-any.whl (8.8 kB view hashes)

Uploaded Python 3

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