aiolimiter
[![GitHub Actions status for default branch][checks_badge]][checks_status] [![codecov.io status for default branch][codecov_badge]][codecov_status] [![Latest PyPI package version][pypi_badge]][aiolimiter_release] [![Latest Read The Docs][rtd_badge]][aiolimiter_docs]
[checks_badge]: https://github.com/mjpieters/aiolimiter/actions/workflows/ci-cd.yml/badge.svg [checks_status]: https://github.com/mjpieters/aiolimiter/actions/workflows/ci-cd.yml "GitHub Actions status for default branch" [codecov_badge]: https://codecov.io/gh/mjpieters/aiolimiter/branch/main/graph/badge.svg [codecov_status]: https://codecov.io/gh/mjpieters/aiolimiter "codecov.io status for default branch" [pypi_badge]: https://img.shields.io/pypi/v/aiolimiter [aiolimiter_release]: https://pypi.org/project/aiolimiter "Latest PyPI package version" [rtd_badge]: https://readthedocs.org/projects/aiolimiter/badge/?version=latest [aiolimiter_docs]: https://aiolimiter.readthedocs.io/en/latest/?badge=latest "Latest Read The Docs"
Introduction
An efficient implementation of a rate limiter for asyncio.
This project implements the [Leaky bucket algorithm][], giving you precise control over the rate a code section can be entered:
from aiolimiter import AsyncLimiter
allow for 100 concurrent entries within a 30 second window
rate_limit = AsyncLimiter(100, 30)
async def some_coroutine():
async with rate_limit:
# this section is at most going to entered 100 times
# in a 30 second period.
await do_something()
It was first developed [as an answer on Stack Overflow][so45502319].
Documentation
https://aiolimiter.readthedocs.io
Installation
$ pip install aiolimiter
The library requires Python 3.10 or newer.
Requirements
- Python >= 3.10
License
aiolimiter is offered under the MIT license.
Source code
The project is hosted on [GitHub][].
Please file an issue in the [bug tracker][] if you have found a bug or have some suggestions to improve the library.
Developer setup
This project uses [uv][] to manage dependencies, testing and releases. Make sure you have installed that tool, then run the following command to get set up:
uv sync
Tests are run with pytest and tox. Releases are made managed by a GitHub Actions workflow. Code quality is maintained with ruff and pyright, and prek runs quick checks to maintain the standards set.
A Taskfile is provided that defines specific tasks such as linting, formatting or previewing the documentation:
$ task --list
task: Available tasks for this project:
- default: Default task, runs linters and tests
- dev:format: Runs formatters (aliases: format)
- dev:install-prek: Install prek into local git checkout (aliases: dev:install-precommit)
- dev:lint: Runs linters (aliases: lint)
- dev:lint:code: Lint the source code
- dev:lint:renovate: Lint the Renovate configuration file
- dev:test: Run tests (aliases: test)
- dev:tox: Run tests with tox (aliases: tox)
- dev:uv-lock: Updates the uv lock file (aliases: lock)
- dist:build: Build the distribution packages (aliases: dist)
- dist:clean: Remove built distribution packages (aliases: clean)
- dist:publish: Publish package to PyPI (aliases: publish)
- docs:build: Build project documentation (aliases: docs)
- docs:checks: Run all documentation checks
- docs:checks:spelling: Check documentation spelling.
- docs:checks:towncrier: Check changelog towncrier output()
- docs:checks:towncrier_fragments: Check changelog towncrier fragments
- docs:clean: Clean the documentation build directory
- docs:serve: Live preview server for project documentation (aliases: preview)
[leaky bucket algorithm]: https://en.wikipedia.org/wiki/Leaky_bucket
[so45502319]: https://stackoverflow.com/a/45502319/100297
[github]: https://github.com/mjpieters/aiolimiter
[bug tracker]: https://github.com/mjpieters/aiolimiter/issues
[uv]: https://docs.astral.sh/uv/