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.cookies和Session.send调用extract_cookies_to_jar(self.cookies, ...),并调用jar.extract_cookies(...)(jar是self.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来澄清文档.
| 归档时间: |
|
| 查看次数: |
14668 次 |
| 最近记录: |