Python 的流行Requests该库在其主页上据说是线程安全的,但没有给出更多细节。如果我打电话requests.session()
,然后我可以安全地将这个对象传递给多个线程,如下所示:
session = requests.session()
for i in xrange(thread_count):
threading.Thread(
target=target,
args=(session,),
kwargs={}
)
并在多个线程中使用相同的连接池发出请求?
如果是这样,这是推荐的方法,还是应该为每个线程提供自己的连接池? (假设所有单个连接池的总大小总计为一个大连接池的大小,如上面的连接池。)每种方法的优缺点是什么?
查阅来源后requests.session,我想说会话对象可能是线程安全的,具体取决于所使用的 CookieJar 的实现。
Session.prepare_request
读取自self.cookies
, and Session.send
calls extract_cookies_to_jar(self.cookies, ...)
,这就是所谓的jar.extract_cookies(...)
(jar
being self.cookies
在这种情况下)。
来源为Python 2.7 的cookielib获取锁(threading.RLock
)同时更新 jar,因此它看起来是线程安全的。另一方面,的文档cookielib没有提到线程安全,所以也许不应该依赖这个功能?
UPDATE
如果您的线程正在改变会话对象的任何属性,例如headers
, proxies
, stream
等或致电mount
方法或使用会话with
语句等那么它就不是线程安全的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)