Экспоненциальный откат: time.sleep with random.randint(0, 1000)/1000
Во многих примерах кода Google API я видел эту строку кода.
time.sleep((2 ** n) + (random.randint(0, 1000) / 1000))
random.randint(0, 1000) / 1000
всегда возвращает случайные миллисекунды.
Какая польза от этих случайных миллисекунд?
Ответы
Ответ 1
Причина объясняется в документации API:
В приведенном выше потоке random_number_milliseconds является случайным числом миллисекунды меньше или равно 1000. Это необходимо, чтобы избежать некоторые ошибки блокировки в некоторых параллельных реализациях. Значение random_number_milliseconds должен быть переопределен после каждого ожидания.
Это обычная техника для "размытия" времени доступа API, чтобы избежать перебоев, вызванных повторяющимися схемами получения и снятия блокировки ресурсов.
Ответ 2
Иметь случайность в подобных ситуациях - это хорошо. Например, если у вас большое количество клиентов, обращающихся к одному и тому же серверу, их использование одного и того же детерминированного отката может привести к тому, что они попадут на сервер в идеальном режиме, что нежелательно.