Проблема с 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]

Это создаст ваш список неотправленных запросов, а затем отправит их все вместе. Другими словами:

  • Итерация цикла, создание неотправленного запроса
  • Итерация цикла, создание неотправленного запроса
  • ...
  • Отправить все запросы одновременно
Другие вопросы по тегам