⏲️ Easy rate limiting for Python. Rate limiting async and thread-safe decorators and context-managers using the token bucket algorithm.
Project description
⏲️ Easy rate limiting for Python
limiter
makes it easy to add rate limiting to Python projects, using a token bucket algorithm. limiter
can provide Python projects and scripts with:
- Rate limiting thread-safe decorators
- Rate limiting async decorators
- Rate limiting thread-safe context-managers
- Rate limiting async context-managers
Here are a few benefits of using limiter
:
- Easily control burst and average request rates
limiter
is thread-safe, with no need for a timer thread- Has a simple API that takes advantage of Python's features, idioms and type hinting
Usage
You can define dynamic and static limiters, and use them across your project.
Dynamic limit
You can define a limiter with a set rate
and capacity
. Then you can consume a dynamic amount of tokens from different buckets using limit()
:
from limiter import get_limiter, limit
REFRESH_RATE: int = 2
BURST_RATE: int = 3
MSG_BUCKET: bytes = b'messages'
limiter = get_limiter(rate=REFRESH_RATE, capacity=BURST_RATE)
@limit(limiter)
def download_page(url: str) -> bytes:
...
@limit(limiter, consume=2)
async def download_page(url: str) -> bytes:
...
def send_page(page: bytes):
with limit(limiter, consume=1.5):
...
async def send_page(page: bytes):
async with limit(limiter):
...
@limit(limiter, bucket=MSG_BUCKET)
def send_email(to: str):
...
async def send_email(to: str):
async with limit(limiter, bucket=MSG_BUCKET):
...
Static limit
You can define a static limit
and share it between blocks of code:
limit_downloads = limit(limter, consume=2)
@limit_downloads
def download_page(url: str) -> bytes:
...
@limit_downloads
async def download_page(url: str) -> bytes:
...
def download_image(url: str) -> bytes:
with limit_downloads:
...
async def download_image(url: str) -> bytes:
async with limit_downloads:
...
Installation
Requirements
- Python 3.7+
Installing from PyPI
python3 -m pip install limiter
License
See LICENSE
. If you'd like to use this project with a different license, please get in touch.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file limiter-0.2.0.post1.tar.gz
.
File metadata
- Download URL: limiter-0.2.0.post1.tar.gz
- Upload date:
- Size: 15.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.7.1 importlib_metadata/4.10.0 pkginfo/1.8.2 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.10.1
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 15f20eb252383c68b611c6d79763adc3046366ea054a88899740e7cabac11cd0 |
|
MD5 | da990fbde1aa2d7c9ccb7ff1ca251c49 |
|
BLAKE2b-256 | e1623752ef00d2ffa5e61ba036b6a43c7cc8fdb9151da7192f8ebf97acd9aa3e |
File details
Details for the file limiter-0.2.0.post1-py2.py3-none-any.whl
.
File metadata
- Download URL: limiter-0.2.0.post1-py2.py3-none-any.whl
- Upload date:
- Size: 16.0 kB
- Tags: Python 2, Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.7.1 importlib_metadata/4.10.0 pkginfo/1.8.2 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.10.1
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 30a032fd431e6c406caf372d6b28d52388c8c1d540e2fee1d96a8ca083417300 |
|
MD5 | aaee09103a14bc480c5630b197950551 |
|
BLAKE2b-256 | bc6f75ce6e19359016467048a8a2e068a5c95d9313b88452fea8c6b89ea71fdf |