Used to limit function call frequency. It ensures your function is called evenly within the limit rather than being called intensively in a short time.
Project description
Rate Keeper: Used to limit function call frequency. It ensures your function is called evenly within the limit rather than being called intensively in a short time. Moreover, it can dynamically adjust the call frequency based on remaining calls and time.
Installation
pip install rate-keeper
Quick Start
from rate_keeper import RateKeeper
if __name__ == "__main__":
rate_keeper = RateKeeper(limit=3, period=1)
@rate_keeper.decorator
def request(url: str) -> str:
print(url, rate_keeper, f"{rate_keeper.delay_time:.2f}")
count = 0
while count < 6:
request(f"https://www.example.com/{count}")
count += 1
# Output:
# https://www.example.com/0 RateKeeper(limit=3, period=1, used=1, reset=89614.39) 0.00
# https://www.example.com/1 RateKeeper(limit=3, period=1, used=2, reset=89614.39) 0.50
# https://www.example.com/2 RateKeeper(limit=3, period=1, used=1, reset=89615.406) 0.48
# https://www.example.com/3 RateKeeper(limit=3, period=1, used=2, reset=89615.406) 0.50
# https://www.example.com/4 RateKeeper(limit=3, period=1, used=1, reset=89616.421) 0.49
# https://www.example.com/5 RateKeeper(limit=3, period=1, used=2, reset=89616.421) 0.50
Dynamic Adjust
from datetime import datetime, timezone
from typing import Dict
import requests
from requests import Response
from rate_keeper import RateKeeper
timestamp_clock = datetime.now(timezone.utc).timestamp
rate_keeper = RateKeeper(limit=5000, period=3600, clock=timestamp_clock)
@rate_keeper.decorator
def fetch(
method: str, url: str, headers: Dict[str, str] = {}, params: Dict[str, str] = {}
) -> Response:
# https://docs.github.com/en/rest/using-the-rest-api/rate-limits-for-the-rest-api#checking-the-status-of-your-rate-limit
response = requests.request(method, url, headers=headers, params=params)
headers_map = {
"x-ratelimit-limit": rate_keeper.update_limit,
"x-ratelimit-used": rate_keeper.update_used,
"x-ratelimit-reset": rate_keeper.update_reset,
}
for key, value in response.headers.items():
lower_key = key.lower()
if lower_key in headers_map:
headers_map[lower_key](int(value))
return response
def create_headers(token: str) -> Dict[str, str]:
return {
"Accept": "application/vnd.github.v3+json",
"User-Agent": "Python requests GitHub API",
"Authorization": f"token {token}",
}
print(rate_keeper, f"{rate_keeper.recommend_delay:.2f}")
response = fetch("GET", "https://api.github.com/user", create_headers("github_token"))
print(response.json())
print(rate_keeper, f"{rate_keeper.recommend_delay:.2f}")
# Output:
# RateKeeper(limit=5000, period=3600, used=0, reset=1745897378.901664) 0.00
# {'message': 'Bad credentials', 'documentation_url': 'https://docs.github.com/rest', 'status': '401'}
# RateKeeper(limit=60, period=3600, used=3, reset=1745896988) 56.30
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file rate_keeper-0.2.1.tar.gz.
File metadata
- Download URL: rate_keeper-0.2.1.tar.gz
- Upload date:
- Size: 4.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a55b982d503ee80a3bdf605c40bdbbe21258991d9ebd0cbf83a361ab2834d03d
|
|
| MD5 |
c65e2bbe0b0c174edd8fbf1ee4329372
|
|
| BLAKE2b-256 |
8a13de1f5da419ce636fae2b195fbee61c949d66e1eb0ce3aab631e3a98277ec
|
File details
Details for the file rate_keeper-0.2.1-py3-none-any.whl.
File metadata
- Download URL: rate_keeper-0.2.1-py3-none-any.whl
- Upload date:
- Size: 5.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
703c341f6ddc24a6078a2e52b7148482597d4d8e7872aa4ca4ea0a1e0355f809
|
|
| MD5 |
27d30106ea353b5bf040754b06f5cc85
|
|
| BLAKE2b-256 |
048b96386fdd489862b7d807ef3a66bca8eabd46ad1b98922d165b0510ba83d4
|