Проблема с Python grequests
Я пытаюсь делать вызовы на несколько URL-адресов одновременно, используя библиотеку grequests для python. Проблема в том, что я не совсем понимаю логику grequests. Ниже приведен пример (отредактированная версия) моего кода:-
respArray = []
response = []
sessionvar = requests.Session()
sessionvar.trust_env = False
for each in range(0,len(urls)):
response.append(grequests.get(urls[each],session=sessionvar,cookies=cookiesArray[each]))
eachresp = grequests.map(response)
for r in eachresp:
respArray.append(r.json())
return respArray
Мой respArray возвращает каждый отдельный массив, который был возвращен из URL. Когда я запускаю этот массив, создается впечатление, что каждый из них работает в своем собственном цикле, а не одновременно. Я не понимаю, как я могу заставить его работать одновременно, чтобы получить более быстрые результаты... Любая помощь будет принята с благодарностью.
1 ответ
Этот код:
for each in range(0,len(urls)):
response.append(grequests.get(urls[each],session=sessionvar,cookies=cookiesArray[each]))
eachresp = grequests.map(response)
for r in eachresp:
respArray.append(r.json())
Эффективно отправляет каждый запрос последовательно. Вы отправляете URL-адрес и ждете, когда греквесты отправят его в каждой итерации цикла.
В основном это выглядит так:
- Итерация цикла, ожидание запроса
- Итерация цикла, ожидание запроса
и т.п.
Вы должны следовать указаниям их документации:
# Build a list of unsent requests
requests = (grequests.get(url) for url in urls)
# Send them all at once
results = grequests.map(requests)
return [r.json() for r in results]
Это создаст ваш список неотправленных запросов, а затем отправит их все вместе. Другими словами:
- Итерация цикла, создание неотправленного запроса
- Итерация цикла, создание неотправленного запроса
- ...
- Отправить все запросы одновременно