Example exponential backoff algorithm
- When a collision first occurs, send a "Jamming signal" to prevent further data from being sent.
- Resend a frame after either 0 seconds or 51.2 μs, chosen at random.
- If that fails, resend the frame after either 0 s, 51.2 μs, 102.4 μs, or 153.6 μs.
- If that still doesn't work, resend the frame after k · 51.2 μs, where k is a random integer between 0 and 23 ? 1.
- In general, after the cth failed attempt, resend the frame after k · 51.2 μs, where k is a random integer between 0 and 2c ? 1.
簡(jiǎn)單的 Python 實(shí)現(xiàn),
import functools
import random
import time
def retry(tries, back_off=0.5):
def _retry(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
max_retries = tries
result = func(*args, **kwargs)
while max_retries > 0:
if result:
return result
max_retries -= 1
d = random.randint(0, (tries - max_retries) ** 2 - 1)
print(f"第{tries - max_retries}次重試,時(shí)間為u0z1t8os*0.5")
time.sleep(d * back_off)
result = func(*args, **kwargs)
return result
return wrapper
return _retry
@retry(5)
def get_response():
print("get http response")
if __name__ == '__main__':
get_response()
輸出結(jié)果為
get http response
第1次重試,時(shí)間為0*0.5
get http response
第2次重試,時(shí)間為1*0.5
get http response
第3次重試,時(shí)間為7*0.5
get http response
第4次重試,時(shí)間為4*0.5
get http response
第5次重試,時(shí)間為10*0.5
get http response
設(shè)置的基本避退時(shí)間為 0.5 ,重試次數(shù)為 5