我最近发现了全局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应用程序的一部分。
答案 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
连接,这似乎过分了。