Параллельные сетевые запросы: сравнение разных подходов - PullRequest
0 голосов
/ 27 февраля 2020

Я хотел бы запросить 100 URL за раз, и в настоящее время я делаю это:

responses = list(PoolExecutor(max_workers=NUM_PARALLEL).map(
                 lambda xml: requests.post(URL, headers=HEADERS, data={'message': xml}), 
                 xmls))

Несколько вопросов по этому поводу:

  1. Является ли list лучшим способом «оценить» фактический генератор объекта / выражения? Если я не list, я просто получаю что-то вроде: <generator object Executor.map.<locals>.result_iterator at 0x10ecf9888>
  2. Часто ли PoolExecutor используется для выполнения параллельных сетевых запросов в python3, или есть другие методы, которые являются более предпочтительными?
  3. В чем разница между PoolExecutor, AsyncIO и concurrent.futures, чтобы сделать что-то подобное?

1 Ответ

1 голос
/ 05 марта 2020

Является ли список лучшим способом «оценить» фактический генератор объекта / выражения? Если я не перечисляю список, я просто получаю что-то вроде: .result_iterator в 0x10ecf9888>

Существует ответ speci c в переполнении стека , который, я думаю, решает вашу проблему.

Часто ли PoolExecutor используется для выполнения параллельных сетевых запросов в python3, или есть другие более предпочтительные методы?

Есть и другие методы, да, и вы можете найти здесь, в StackOverflow хотя бы один вопрос с различными примерами . В ответах на этот вопрос есть только один человек, использующий concurrent.futures.ThreadPoolExecutor, и это самое близкое к нему значение PoolExecutor.

В чем различия между PoolExector, AsyncIO и concurrent.futures сделать что-то подобное?

Ответ на этот вопрос можно найти в книге Использование Asyncio в Python, Глава 3. Прохождение Asyncio . Точнее, AsyncIO предоставляет API, который очень похож на API в пакете concurrent.futures. Этот пакет обеспечивает ThreadPoolExecutor и ProcessPoolExecutor. По умолчанию используется основанный на потоках, но могут использоваться исполнители, основанные как на потоках, так и на пулах.

...