Python的Requests库线程中的Session对象是否安全?

DJG*_*DJG 42 python connection-pooling thread-safety python-requests

据称Python的流行Requests库在其主页上是线程安全的,但没有给出进一步的细节.如果我调用requests.session(),我可以安全地将此对象传递给多个线程,如下所示:

session = requests.session()
for i in xrange(thread_count):
    threading.Thread(
        target=target,
        args=(session,),
        kwargs={}
    )
Run Code Online (Sandbox Code Playgroud)

并在多个线程中使用相同的连接池发出请求?

如果是这样,这是推荐的方法,还是应该为每个线程提供自己的连接池?(假设所有单个连接池的总大小总计为一个大连接池的大小,如上所述.)每种方法的优缺点是什么?

mil*_*dev 22

在查看了源代码之后requests.session,我将说会话对象可能是线程安全的,具体取决于所使用的CookieJar的实现.

Session.prepare_request从读取self.cookiesSession.send调用extract_cookies_to_jar(self.cookies, ...),并调用jar.extract_cookies(...)(jarself.cookies在这种情况下).

Python 2.7的cookielib源代码threading.RLock在更新jar时获取了一个lock(),因此它看起来是线程安全的.另一方面,文档中cookielib没有提及线程安全性,所以也许不应该依赖此功能?

UPDATE

如果你的线程变异会话对象的任何属性,如headers,proxies,stream,等,或调用mount方法或使用与会话with等语句那么它不是线程安全的.


Gre*_*ard 21

https://github.com/kennethreitz/requests/issues/1871暗示Session不是线程安全的,并且至少有一个维护者建议每个线程使用一个Session.

我刚刚打开https://github.com/kennethreitz/requests/issues/2766来澄清文档.