python - Django中的持久连接?
问题描述
我试图了解持久连接如何提高性能,尤其是当我的应用程序读取繁重时。所以,我有 100000 行的记录,并且我已经索引了用户名字段。所以,我创建了一个端点,我可以在其中使用用户名进行查询,它给了我温度。这仅用于测试目的。因此,我编写了另一个脚本,该脚本具有创建一个运行 1000 次的循环并向端点发出请求的函数。我记录了请求响应时间并将其保存在一个列表中,然后计算完成 1000 个请求所需的总时间。首先,我尝试使用没有持久连接的默认 Django 数据库设置,每次我对时间进行基准测试,它记录所有 1000 个请求的时间约为 43 秒。接下来,我添加了 CONN_MAX_AGE=60 并多次运行脚本,发现时间每次增加到103秒。现在,如果我没记错的话,持久连接应该减少了总时间,但由于某种原因,它比每次请求-响应完成时打开和关闭的正常连接要高得多。我的问题是为什么会这样?脚本.py
import requests
import random
import time
def make_request():
username = ['00b076300079144ca0667c341aeac046','remy','surajit','remy11']
t = []
for i in range(1000):
response = requests.get('http://127.0.0.1:8082/temperature/t/{}/'.format(random.choice(username)))
t.append(response.elapsed.total_seconds())
print(random.choice(username),response.status_code,response.elapsed.total_seconds())
print('total time',sum(t))
make_request()
DetailView 端点
class TempratureDetailView(DetailView):
model = Temperature
template_name = 'temperature/t_detail.html'
def get_object(self, queryset=None):
return Temperature.objects.get(username=self.kwargs.get('username'))
模型.py
class Temperature(models.Model):
username = models.TextField(db_index=True,primary_key=True)
temperature = models.IntegerField(blank=True, null=True)
class Meta:
db_table = 'temperature'
持久数据库设置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': '',
'USER': '',
'PASSWORD': '',
'HOST': 'localhost',
'PORT': '',
'CONN_MAX_AGE': 600, #10 minutes
}
}
解决方案
根据您在评论中的说明,您正在开发服务器上运行这些测试。
引用 Django 的文档:
开发服务器为它处理的每个请求创建一个新线程,从而消除持久连接的影响。不要在开发过程中启用它们。
基本上每个线程都会启动它自己到数据库的连接,考虑到在测试中发出的请求数量以及 的设置CONN_MAX_AGE=60
,很可能您的数据库不支持与服务器在这种情况下建立的连接一样多,导致更长的等待关闭以前的连接,并且还否定了持久连接的使用。鉴于得出正确结论的情况,需要在生产服务器上进行更好的测试
推荐阅读
- python - 如何将索引添加到 Python 中的列表列表
- scala - akka 流不消耗,只记录 WakeupTimeout
- vue.js - axios 拦截器与 vuejs 自定义组件集成,用于以通用方式显示错误消息
- web-services - Amadeus Cancel PNR XML 返回空响应
- ios - 取消按钮无法在 GMSAutocompleteViewController 中显示
- python - Python:按时间间隔分组
- symfony - ButtonType Symfony 的 isClicked()
- java - RecyclerView 带有过滤器列表的可点击对象
- apache - Httpd.conf 重定向到外部 url apache tomcat
- sql - Azure 流分析 - 将查询输出转换为 JSON