当前位置: 首页 > 知识库问答 >
问题:

来自Python请求库线程的Session对象安全吗?

岳阳飙
2023-03-14

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

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

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

如果是,这是推荐的方法,还是应该给每个线程一个自己的连接池?(假设所有单个连接池的总大小与一个大连接池的大小相加,就像上面的那个。)每种方法的利弊是什么?

共有1个答案

申屠弘图
2023-03-14

在查看了requests.session的源代码之后,我要说session对象可能是线程安全的,这取决于正在使用的CookieJar的实现。

session.prepare_requestself.cookies读取,而session.send调用extract_cookies_to_jar(self.cookies,...),并调用jar.extract_cookies(...)(jar(本例中jarself.cookies)。

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

更新

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

 类似资料:
  • 问题内容: Spring对象是线程安全的吗?如果没有,如何使它们线程安全? 问题答案: 这是两个不相关的问题: spring线程安全吗? 没有。 Spring具有不同的bean 作用域(例如Prototype,Singleton等),但是所有这些作用域都是在创建bean 时强制执行的。例如,每次“注入”一个“原型”范围的bean都会被创建,而一个“单个”范围的bean将被创建一次并在应用程序上下文

  • 问题内容: 是否可以在JAX-RS下以REST方法访问Request对象? 我刚刚发现 问题答案: 在JAX- RS上,必须使用@Context注释Request参数: 您也可以选择注入: UriInfo HttpHeaders 安全上下文 HttpServletRequest

  • 我正在使用 okHttp 库来管理我的网页托管连接。所以我的问题是我不确定okHttp是否是线程安全的。 我的意思是,如果发送一些数据,同时服务器应用程序向我的客户端应用程序发送数据,okHttp应该接收这些数据,它会抛出异常吗?

  • 问题内容: 阅读“实践中的Java并发性”,第3.5节包含以下内容: 除了创建两个的明显的线程安全隐患外,该书还声称可能会发生发布问题。 此外,对于诸如 一个可以扔! 这怎么可能?我能想到的唯一允许这种荒谬行为的方法是,如果构造函数不被阻塞,那么当构造函数代码仍在另一个线程中运行时,将创建对实例的引用。 这可能吗? 问题答案: 之所以可行,是因为Java的内存模型较弱。它不保证读写顺序。 可以通过

  • 类OneValueCache是不可变的。但是我们可以更改变量缓存的引用。 但我不能理解为什么VolateCachedFactorizer类是线程安全的。 对于两个线程(线程A和线程B),如果线程A和线程B同时到达,那么两个线程A和B都将尝试创建OnEvalueCache。然后线程A到达而线程B同时到达。然后线程A将创建一个,它覆盖threadB创建的值(OneValueChange是不可变的,但是

  • 问题内容: 我经常听到对Swing库中缺乏线程安全性的批评。但是,我不确定自己将在自己的代码中执行的操作会导致问题: 在什么情况下,Swing不是线程安全的事实起作用? 我应该积极避免做什么? 问题答案: 切勿执行长时间运行的任务以响应按钮,事件等,因为这些事件在事件线程上。如果您阻止事件线程,则整个GUI将完全无响应,从而使用户感到非常生气。这就是为什么Swing看起来缓慢又硬朗。 使用线程,执