Precise FloodWait Handling in Pyrogram: Making sleep_threshold Work as Expected
Background
When interacting with the Telegram API, developers often encounter rate limits, which result in FloodWait or FloodPremiumWait errors. These errors indicate that the client must wait a certain number of seconds before making further requests. Pyrogram, like many Telegram client libraries, provides a mechanism to automatically handle these waits in its invoke() method, using a parameter called sleep_threshold.
The Old Behavior
Previously, the relevant code in the invoke() method looked like this:
1
2
if amount > sleep_threshold >= 0:
raise
This logic was intended to control whether the client should sleep (wait) for the duration specified by the FloodWait, or immediately raise the exception to the caller. The idea was:
- If
amount(the wait time) is greater thansleep_thresholdandsleep_thresholdis non-negative, raise the exception. - Otherwise, sleep for
amountseconds and then continue.
However, this approach had a subtle flaw: when sleep_threshold was set to 0, the client would still sleep for the full FloodWait duration instead of raising the exception immediately. This was counterintuitive, especially for advanced bot developers who want to handle rate limits themselves and expect sleep_threshold=0 to mean “never sleep, always raise”.
The New Behavior
To address this, the condition was changed to:
1
2
if sleep_threshold < 0 or amount > sleep_threshold:
raise
With this new logic:
- If
sleep_thresholdis negative, the exception is always raised (never sleeps). - If
sleep_thresholdis zero, the exception is always raised (never sleeps), which is now intuitive and expected. - If
sleep_thresholdis positive, the client will only sleep if the required wait time (amount) is less than or equal to the threshold. If the wait time is longer, the exception is raised.
Why This Matters
This change gives developers precise control over how their bots handle rate limits:
- Immediate Handling: Setting
sleep_threshold=0now guarantees that the client will never sleep for aFloodWaitthe exception is always raised, allowing the developer to implement custom logic (such as queuing, user notifications, or distributed rate limit handling). - Custom Thresholds: Developers can set a positive
sleep_thresholdto allow the client to automatically handle short waits, but raise for longer ones. - Opt-out: Setting
sleep_thresholdto a negative value disables all automatic sleeping, always raising the exception.