Python的流行Requests库据说在其主页上是线程安全的,但没有给出进一步的细节。如果我调用requests.session()
,我可以安全地将此对象传递给多个线程,如下所示:
session = requests.session()
for i in xrange(thread_count):
threading.Thread(
target=target,
args=(session,),
kwargs={}
)
并在多个线程中使用相同的连接池发出请求?
如果是这样,这是推荐的方法,还是应该为每个线程提供自己的连接池? (假设所有单个连接池的总大小总计为一个大连接池的大小,如上面那个。)每种方法的优缺点是什么?
答案 0 :(得分:19)
在查看了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's cookielib
的来源在更新jar时获取锁(threading.RLock
),因此它似乎是线程安全的。另一方面,documentation for cookielib
没有提及线程安全性,所以也许不应该依赖这个功能?
更新
如果您的线程正在改变会话对象的任何属性,例如headers
,proxies
,stream
等,或者调用mount
方法或使用会话with
语句等,那么它不是线程安全的。