Обработка ConnectionError в асинхронных HTTP-запросах с Python
При условии, что основной целью является запуск сценария (без блокировки / прерывания других задач при возникновении ошибки ConnectionError) в любом случае, даже если временно отсутствует подключение к Интернету.
Пока я реализовывал обработку ошибок в своем скрипте для отправки асинхронных HTTP- запросов, я столкнулся со странным поведением, когда возникает исключение ConnectionError:
Как будто интернет-соединение отсутствует, гринлет блокирует одновременность запросов, и одновременно делается только один запрос, теряя одновременность задач.
Вот пример, который, я надеюсь, прояснит все:
#Python 3.4 Windows 7 64 bit
import gevent.monkey
gevent.monkey.patch_all()
from gevent.pool import Pool
import requests
import time
import os
url = "http://pythonrequest.altervista.org/ten_seconds_delayed.php"
def task(args):
try:
r = requests.get(url)
except requests.exceptions.ConnectionError as e:
print("[ERROR]: ", e)
pool = Pool(10)
start_time = time.time()
for i in range(0,10):
args = []
args.append(i)
args.append(url)
pool.spawn(task, args)
print("Tasks sent to the pool, waiting for completing...")
pool.join()
end_time = time.time()
seconds_elapsed = end_time-start_time
print("Tasks completed")
print("seconds_elapsed: ",seconds_elapsed)
os.system("PAUSE")
Я запускал сценарий два раза в двух условиях.
Первый раз я запустил скрипт с работающим интернет-соединением.
Время выполнения составляет около 10 секунд.
Во второй раз я запустил скрипт с отсутствующим интернет-соединением (Windows-> Устройства-> Сетевое устройство-> Отключить).
Время выполнения составляет около 100 секунд.
Почему 100 секунд? Разве не должно быть 10 секунд, так как время ожидания для одного запроса составляет 10 секунд?
Кажется, время выполнения timeout_of_request*number_of_request.
Я ожидаю, что во втором случае время выполнения timeout_of_request.
Если запросы были одновременными, они должны занимать около 10 секунд, иначе это означает, что они не являются одновременными?
Что мне нужно, это сохранить одновременность задач. Любое предложение?