Обработка 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 секунд, иначе это означает, что они не являются одновременными?
Что мне нужно, это сохранить одновременность задач. Любое предложение?

0 ответов

Другие вопросы по тегам