Является ли объект 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 и т.д. то он не является потокобезопасным.