Является ли объект Session из библиотеки запросов Python безопасным?
Python популярная Requests библиотека называется потокобезопасной на своей домашней странице, но дальнейшие подробности не приводятся. Если я вызываю requests.session()
, могу ли я затем безопасно передать этот объект нескольким потокам, например:
session = requests.session()
for i in xrange(thread_count):
threading.Thread(
target=target,
args=(session,),
kwargs={}
)
и делать запросы с использованием одного пула соединений в нескольких потоках?
Если это так, рекомендуемый подход или каждый поток должен иметь собственный пул соединений? (Предполагая, что общий размер всех отдельных пулов подключений суммируется с размером того, что будет одним большим пулом подключений, как и выше). Каковы плюсы и минусы каждого подхода?
Ответы
Ответ 1
После просмотра источника requests.session
, я хочу сказать, что объект сеанса может быть потокобезопасным, в зависимости от реализации используемого CookieJar.
Session.prepare_request
читает из self.cookies
и Session.send
вызывает extract_cookies_to_jar(self.cookies, ...)
, и вызывает в этом случае jar.extract_cookies(...)
(jar
self.cookies
).
Источник Python 2.7 cookielib
получает блокировку (threading.RLock
), в то время как она обновляет банку, поэтому она выглядит потокобезопасной. С другой стороны, документация для cookielib
ничего не говорит о безопасности потоков, поэтому, возможно, на эту функцию не следует зависеть?
ОБНОВЛЕНИЕ
Если ваши потоки мутируют любые атрибуты объекта сеанса, такие как headers
, proxies
, stream
и т.д., или вызов метода mount
или использование сеанса с инструкцией with
и т.д. то он не является потокобезопасным.
Ответ 2
https://github.com/kennethreitz/requests/issues/1871 подразумевает, что сеанс не является потокобезопасным и что по крайней мере один поддерживающий рекомендует один сеанс на поток.
Я только что открыл https://github.com/kennethreitz/requests/issues/2766, чтобы уточнить документацию.