Exponential backoff: time.sleep with random.randint(0, 1000) / 1000

前端 未结 2 974
没有蜡笔的小新
没有蜡笔的小新 2021-01-01 12:12

In many google api\'s code samples i have seen this line of code.

time.sleep((2 ** n) + (random.randint(0, 1000) / 1000))

random.rand

相关标签:
2条回答
  • 2021-01-01 12:33

    The reason is explained the API documentation:

    In the above flow, random_number_milliseconds is a random number of milliseconds less than or equal to 1000. This is necessary to avoid certain lock errors in some concurrent implementations. The value of random_number_milliseconds must be redefined after each wait.

    This is a common technique to "fuzz" the timing of APIs accesses to avoid thrashing caused by falling into recurring patterns of resource lock acquisition and release.

    0 讨论(0)
  • 2021-01-01 12:39

    Having a bit of randomness in situations like this is good. For example, if you have a large number of clients hitting the same server, having them use the same deterministic backoff could result in them hitting the server in perfect lockstep, which isn't desirable.

    0 讨论(0)
提交回复
热议问题