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

时间:2013-08-12 13:19:03

标签: python thread-safety connection-pooling python-requests

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

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

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

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

1 个答案:

答案 0 :(得分:19)

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

Session.prepare_requestself.cookiesSession.send来电extract_cookies_to_jar(self.cookies, ...)读取,并调用jar.extract_cookies(...)jarself.cookies这种情况)。

Python 2.7's cookielib的来源在更新jar时获取锁(threading.RLock),因此它似乎是线程安全的。另一方面,documentation for cookielib没有提及线程安全性,所以也许不应该依赖这个功能?

更新

如果您的线程正在改变会话对象的任何属性,例如headersproxiesstream等,或者调用mount方法或使用会话with语句等,那么它不是线程安全的。