Как использовать continue с запросами-фьючерсами?

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

Код:

import requests
import time
from requests.exceptions import ConnectionError
from requests_futures.sessions import FuturesSession

def wait_for_con():
    con = False
    while not con:
        try:
            response = requests.get("https://google.com")
            if response.status_code == 200:
                con = True
        except ConnectionError:
            time.sleep(1)



def run (targets):
    with FuturesSession() as session:
        futures = [session.get(target) for target in targets]
        for future in futures:
            try:
                result = future.result()
                status = result.status_code
                print (str(status)+"    "+result.url)
                
            except ConnectionError:
                print ("waitng for connection")
                wait_for_con()
                continue
run(my_url_list)

Пока я пытался запустить его в автономном режиме и выйти в онлайн, он снова и снова печатает "ожидает подключения".

Выход:

waiting for connection
waiting for connection
waiting for connection
waiting for connection
waiting for connection
waiting for connection
waiting for connection
waiting for connection
waiting for connection

Printing Continues... 

Как я могу это исправить?

1 ответ

Причина этого проста: если соединение отсутствует, то даже в самом начале вы не сможете добиться успеха.
Используйте этот код:

import requests
import time
from requests.exceptions import ConnectionError
from requests_futures.sessions import FuturesSession


def wait_for_con():
    con = False
    while not con:
        try:
            response = requests.get("https://google.com")
            if response.status_code == 200:
                con = True
                print("connect")
        except ConnectionError:
            print("trying")
            time.sleep(1)


def run(targets):
    with FuturesSession() as session:
        futures = [session.get(target) for target in targets]
        n = len(futures)
        while (n):

            try:
                n -= 1
                result = futures[n].result()
                status = result.status_code
                print(str(status) + "    " + result.url)

            except ConnectionError:
                print("waitng for connection")
                wait_for_con()
                time.sleep(1)
                print("connection stable")
                futures = [session.get(target) for target in targets]

                # result = future.result()
                # status = result.status_code
                # print(str(status)+"    "+result.url)


my_url_list = ['https://pypi.org/project/requests-futures/',
               'https://pypi.org/project/requests-futures/',
               'https://pypi.org/project/requests-futures/',
               ]
run(my_url_list)
Другие вопросы по тегам