在 Django 中跨多个 HTTP 请求重用Python 请求连接的正确方法是什么?这就是我目前正在做的事情:
import requests
def do_request(data):
return requests.get('http://foo.bar/', data=data, timeout=4)
def my_view1(request)
req = do_request({x: 1})
...
def my_view2(request)
req = do_request({y: 2})
...
Run Code Online (Sandbox Code Playgroud)
所以,我有一个函数可以发出请求。该函数在各种 Django 视图中调用。用户在单独的 HTTP 请求中调用视图。我的问题是:Python 请求是否自动重用相同的连接(通过 urllib3 连接池)?
或者我必须首先创建一个请求会话对象才能使用?
s = requests.Session()
def do_request(data):
return s.get('http://foo.bar/', data=data, auth=('user', 'pass'), timeout=4).text
Run Code Online (Sandbox Code Playgroud)
如果是这样,会话对象是否必须在全局范围内创建,还是应该在函数内部?
def do_request(data):
s = requests.Session()
return s.get('http://foo.bar/', data=data, auth=('user', 'pass'), timeout=4).text
Run Code Online (Sandbox Code Playgroud)
我可以同时有多个 HTTP 请求,因此解决方案需要线程安全...我是连接池的新手,所以我真的不确定,并且这里的请求文档并不广泛。
我在一个环境中工作,Web 应用程序按需派生进程,每个进程都有自己的线程池来为 Web 请求提供服务。线程可能需要向外部服务发出 HTTPS 请求,目前使用 requests 库来执行此操作。当第一次添加 requests 用法时,通过为每个请求创建一个新的requests.Session和requests.adapters.HTTPAdapter甚至通过简单地调用requests.get或requests.post按需来使用它。出现的问题是每次都建立一个新连接,而不是潜在地利用 HTTP 持久连接。一个潜在的解决方法是使用连接池,但是在使用请求库时在线程之间共享 HTTP 连接池的推荐方法是什么?有吗?
第一个想法是共享一个requests.Session,但目前不安全,如“ Python 的请求库中的 Session 对象线程安全吗? ”和“ Session 类的文档线程契约”中所述。在每个线程中按需创建的 srequests.adapters.HTTPAdapter之间共享一个全局变量是否安全且足够requests.Sessions?根据“我们对 urllib3 的 ConnectionPools 的使用不是线程安全的。 ”,即使这样也可能不是有效的使用。无论如何,只需要连接到少量不同的远程端点就可以使它成为一种可行的方法。
python connection-pooling thread-safety python-multithreading python-requests