Requests / Asyncio: есть ли недостаток для создания pool_maxsize = 1000 с сеансом запросов Python? - PullRequest
1 голос
/ 21 мая 2019

Я использую следующий код для увеличения максимального размера пула с запросами:

import requests
session = requests.Session()
session.mount("https://", requests.adapters.HTTPAdapter(pool_maxsize=50))
session.mount("http://", requests.adapters.HTTPAdapter(pool_maxsize=50))

Есть ли недостаток в настройках pool_maxsize=1000?

Иногда мне нужно 50 - 1000 соединений, но в большинстве случаев мне нужно только 1 соединение.

В качестве альтернативы, есть ли способ разрешить динамическое определение размера пула?

КакиеЛучшее решение:

  1. Установить pool_maxsize = 1000
  2. Создать 2 сессии, 1 с pool_maxsize = 1, а другой с pool_maxsize=1000.
  3. Динамически изменить pool_maxsize каки когда мне нужно другое количество соединений.(если возможно)

Скорость имеет первостепенное значение!

Редактировать: Большую часть времени я делаю обычные запросы:

session.get(....)

Но иногда я используюasyncio, где мне нужно выполнить большое количество запросов:

import asyncio
async def perform_async_calls(self, session, urls):
    loop = asyncio.get_event_loop()
    futures = []
    for url in urls:
        futures.append(loop.run_in_executor(None, session.get, url)

    results = []
    for future in futures:
        result = await future
        results.append(result.json())

    return results

1 Ответ

1 голос
/ 23 мая 2019

В HTTP 1.1 клиенты могут отправлять несколько запросов через одно соединение, устанавливая заголовок Keep-Alive. В противном случае вам придется открывать новое соединение для каждого отдельного запроса. При установленном Keep-Alive несколько запросов могут отправляться через одно соединение.

Открытие соединения является дорогостоящим, так как требует дополнительного обхода для TCP-квитирования, прежде чем вы сможете сделать следующий запрос, поэтому вместо этого будет быстрее использовать уже существующее соединение.

Что делает пул соединений, так это то, что после того, как вы делаете запрос, это соединение остается открытым для последующих запросов, которые вы можете сделать, будучи отложенными в пуле. Requests устанавливает заголовок keep alive и управляет пулом за кулисами, поэтому вам обычно не нужно об этом беспокоиться.

Если вы используете многопоточность, пул синхронизирует доступ к соединениям, так что каждое соединение одновременно используется только одним потоком. Для одновременного выполнения нескольких потоков требуется несколько подключений в пуле.

Наличие большего количества соединений, чем потоков, вообще не увеличит производительность, поскольку пакет запросов блокирует поток при выполнении запроса, поэтому поток не может использовать несколько соединений одновременно. Для повышения производительности дополнительных подключений необходимо увеличить количество потоков.

Добавление таких подключений, хотя и помогает, когда скорость сети не ограничена, открытие большего количества подключений не делает Интернет быстрее. Так что просто добавляйте больше потоков и соединений, пока производительность не перестанет расти.

Я не уверен, что вы имеете в виду под динамическим изменением размера. Пул открывает новые соединения, когда это необходимо, и повторно использует старые, когда это возможно. Он прекращает открывать соединения после достижения максимума. В некотором смысле размер пула является динамическим, если он меньше максимального размера.

...