Как использовать continue с запросами-фьючерсами? - PullRequest
0 голосов
/ 09 июля 2020

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

Код:

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)

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

Вывод:

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 Ответ

0 голосов
/ 09 июля 2020

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

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)
...