Как использовать 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)