lixiaotao 2020-06-02
import requests
from datetime import datetime
import time
import random
retry_timeout = 10
def http_request(url, first_request_time=None, retry_counter=0):
    """
  first_request_time: The time of the first request (None if no retries have occurred).
  retry_counter: The number of this retry, or zero for first attempt.
  """
    if not first_request_time:
        first_request_time = datetime.now()
    try:
        elapsed = datetime.now() - first_request_time
        if elapsed.total_seconds() > retry_timeout:
            raise TimeoutError
        if retry_counter > 0:
            # 0.5 * (1.5 ^ i) is an increased sleep time of 1.5x per iteration,
            # starting at 0.5s when retry_counter=0. The first retry will occur
            # at 1, so subtract that first.
            delay_seconds = 0.5 * 1.5**(retry_counter - 1)
            print(f"Delay {delay_seconds}")
            # Jitter this value by 50% and pause.
            time.sleep(delay_seconds * (random.random() + 0.5))
        result = requests.get(url)
        return result.text
    except TimeoutError:
        print("Request Timed out")
        return None
    except requests.exceptions.ConnectionError:
        return http_request(url, first_request_time, retry_counter + 1)
if __name__ == "__main__":
    response_text = http_request("https://thissitedoesntexist.com")
# retries the request to an invalid url until the timeout of 10 second is reached
# A TimeoutError is raised after 10 seconds