Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是Python中的会话对象';s请求库线程安全?_Python_Thread Safety_Connection Pooling_Python Requests - Fatal编程技术网

是Python中的会话对象';s请求库线程安全?

是Python中的会话对象';s请求库线程安全?,python,thread-safety,connection-pooling,python-requests,Python,Thread Safety,Connection Pooling,Python Requests,Python的流行库在其主页上据说是线程安全的,但没有给出进一步的细节。如果我调用requests.session(),我是否可以安全地将此对象传递给多个线程,如下所示: session = requests.session() for i in xrange(thread_count): threading.Thread( target=target, args=(session,), kwargs={} ) 并在多个线程中使用

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

session = requests.session()
for i in xrange(thread_count):
    threading.Thread(
        target=target,
        args=(session,),
        kwargs={}
    )
并在多个线程中使用相同的连接池发出请求


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

在回顾了的源代码之后,我想说会话对象可能是线程安全的,这取决于所使用的CookieJar的实现

会话。准备请求
读取
self.cookies
会话。发送调用
extract\u cookies\u到\u-jar(self.cookies)
,调用
jar.extract\u cookies(…)
jar
在这种情况下是
self.cookies

的源在更新jar时获取锁(
threading.RLock
),因此它看起来是线程安全的。另一方面,没有提到线程安全性,所以也许这个特性不应该被依赖

更新

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

意味着会话不是线程安全的,并且至少有一个维护人员建议每个线程使用一个会话


我只是打开文档来澄清一下。

你知道哪一个更好吗?我现在遇到了几乎相同的问题。我在考虑为每个线程创建一个新会话,以避免在单个连接池中阻塞所有请求。@Marcel Wilson不完全是这样。虽然在我的一个项目中,我使用会话对象一次又一次地请求相同的URL,但我向所有线程发送了相同的会话对象。该应用程序似乎确实有效,但我仍然不确定更好的方法是什么。但是请注意,我的问题不是阻塞连接池,而是一次打开太多连接并发送太多请求。请求是在urllib3之上构建的。请求的线程安全性很大程度上是由于urllib3的线程安全性,而urllib3的doucmentation更详细地讨论了线程安全性。@dg123 I最终在for循环中创建了一个会话。每个线程都有自己的连接池。看起来这取决于
urllib3
是否是线程安全的,我还不相信它是基于线程安全的,我假设如果您执行
my_session.get(url,headers={“某物”:“某物”})
这应该不是问题。