Экспоненциальный откат: 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

Иметь случайность в подобных ситуациях - это хорошо. Например, если у вас большое количество клиентов, обращающихся к одному и тому же серверу, их использование одного и того же детерминированного отката может привести к тому, что они попадут на сервер в идеальном режиме, что нежелательно.