全局请求。会话对象的缺点

时间:2019-08-05 17:40:26

标签: python python-requests

我最近发现了全局request.Session()声明。例如:

# one of many files
import requests

g_session = requests.Session()

def some_foo():
    return g_session.post('https://example.com', data={'key': 'value'}

# rest of the code

来自docs

  

Session对象允许您在请求中保留某些参数。它还会在来自会话实例的所有请求中保留cookie,并将使用urllib3的连接池。因此,如果您要向同一主机发出多个请求,则基础TCP连接将被重用,这可以显着提高性能(请参阅HTTP持久连接)。

据我了解:

好处是无需打开新连接,并且可以重复使用

缺点支持相同的连接并保持内存占用


还有其他吗?

我从未见过这样的全球宣言。大多数情况下,会话以上下文管理器方式使用,或以相同的功能/块代码(而不是全局的)重用对象。

可能的相关信息:它是Django应用程序的一部分。

1 个答案:

答案 0 :(得分:1)

一个缺点是不清楚 Session 是否是线程安全的,因为 requests 文档没有提到它。 2013 年的一个帖子表明它不是:Is the Session object from Python's Requests library thread safe? 但它链接了一个已解决并关闭的 Urllib3 问题:PoolManager is not thread-safe

您可以使会话线程本地化,但是如果您从工作线程访问会话(例如,在带有 uwsgi 的 Flask 之类的 HTTP 服务器中),您最终可能会得到 worker_threads*requests_pool_size 连接,这似乎过分了。