rate_limiter module

class rate_limiter.RateLimiter(max_per_minute=30)[מקור]

Bases: object

מגביל קצב פשוט בזיכרון לפי משתמש.

  • חלון מתגלגל של 60 שניות

  • ללא תלות חיצונית

פרמטרים:

max_per_minute (int)

__init__(max_per_minute=30)[מקור]
פרמטרים:

max_per_minute (int)

Return type:

None

async check_rate_limit(user_id, weight=1)[מקור]

מחזיר True אם מותר להמשיך, אחרת False.

weight — כמה יחידות הקריאה צורכת. הכול או כלום, תחת המנעול: אם אין מקום לכל היחידות, לא נרשמת אף אחת. חיוב יחידה-יחידה בלולאה היה משאיר חלון בין יחידה ליחידה שקריאה אחרת של אותה זהות נכנסת בו (U1), וקריאה שנדחתה באמצע הייתה משאירה אחריה יחידות ששולמו על עבודה שלא נעשתה. ברירת המחדל 1 היא ההתנהגות שהייתה כאן תמיד, ולכן הבוט (main.py, bot_handlers.py) אינו משתנה.

Return type:

bool

פרמטרים:
async get_current_usage_ratio(user_id)[מקור]

מחזיר יחס שימוש נוכחי בחלון (0.0–1.0).

מנקה ערכים ישנים לפני החישוב כדי לשקף את החלון המתגלגל של 60 שניות.

Return type:

float

פרמטרים:

user_id (int)

async seconds_until_allowed(user_id, weight=1)[מקור]

כמה שניות עד שהחלון משחרר מקום ל-weight יחידות — ‏0.0 כשיש מקום כבר עכשיו.

הרשומות בחלון שמורות בסדר הזמן, והן פגות באותו סדר. כדי ש-weight יחידות ייכנסו צריכות לפוג len + weight - max רשומות, ולכן התשובה היא הזמן שנותר לאחרונה מביניהן. במשקל 1 זו בדיוק התשובה שהייתה כאן תמיד — הרשומה הישנה ביותר — וזו התשובה שסירוב יכול לשאת החוצה כ-retry_after במקום ”נסה שוב“ סתמי.

Return type:

float

פרמטרים: