⏲️ Easy rate limiting for Python using a token bucket algorithm, with async and thread-safe decorators and context managers
LGPL-3.0 License
limiter
makes it easy to add rate limiting to Python projects, using a token bucket algorithm. limiter
can provide Python projects and scripts with:
Here are a few benefits of using limiter
:
limiter
is thread-safe, with no need for a timer thread
You can define dynamic and static limiters, and use them across your project.
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):
...
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:
...
python3 -m pip install limiter
See LICENSE
. If you'd like to use this project with a different license, please get in touch.