rate_limiter module
- class rate_limiter.RateLimiter(max_per_minute=30)[מקור]
Bases:
objectמגביל קצב פשוט בזיכרון לפי משתמש.
חלון מתגלגל של 60 שניות
ללא תלות חיצונית
- פרמטרים:
max_per_minute (int)
- async check_rate_limit(user_id, weight=1)[מקור]
מחזיר True אם מותר להמשיך, אחרת False.
weight— כמה יחידות הקריאה צורכת. הכול או כלום, תחת המנעול: אם אין מקום לכל היחידות, לא נרשמת אף אחת. חיוב יחידה-יחידה בלולאה היה משאיר חלון בין יחידה ליחידה שקריאה אחרת של אותה זהות נכנסת בו (U1), וקריאה שנדחתה באמצע הייתה משאירה אחריה יחידות ששולמו על עבודה שלא נעשתה. ברירת המחדל 1 היא ההתנהגות שהייתה כאן תמיד, ולכן הבוט (main.py,bot_handlers.py) אינו משתנה.
- async get_current_usage_ratio(user_id)[מקור]
מחזיר יחס שימוש נוכחי בחלון (0.0–1.0).
מנקה ערכים ישנים לפני החישוב כדי לשקף את החלון המתגלגל של 60 שניות.
- async seconds_until_allowed(user_id, weight=1)[מקור]
כמה שניות עד שהחלון משחרר מקום ל-
weightיחידות — 0.0 כשיש מקום כבר עכשיו.הרשומות בחלון שמורות בסדר הזמן, והן פגות באותו סדר. כדי ש-
weightיחידות ייכנסו צריכות לפוגlen + weight - maxרשומות, ולכן התשובה היא הזמן שנותר לאחרונה מביניהן. במשקל 1 זו בדיוק התשובה שהייתה כאן תמיד — הרשומה הישנה ביותר — וזו התשובה שסירוב יכול לשאת החוצה כ-retry_afterבמקום ”נסה שוב“ סתמי.