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
You can define dynamic and static limiters, and use them across your project.
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):
...
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:
...
- Python 3.7+
python3 -m pip install limiter
See LICENSE
. If you'd like to use this project with a different license, please get in touch.