django后台加载从15秒优化到1秒的过程小记

之前django的后台管理的管理的项目很慢,打开个页面得花十几秒甚至二十秒,经过不断努力优化,终于优化到1秒左右了,很舒服。

先定位慢的主要原因,首先有个表大概有200万条数据,而且机器每天不停地写入,增长很快。再利用diango-debug-toolbar很方便查看出哪些东西耗时,主要查看各种耗时的sql语句。

主要耗时的部分包括:django分页,list_filter,date_hierarchy,有个字段调用第三方接口

list_filter,date_hierarchy优化参见:

https://blog.csdn.net/u011519550/article/details/97521761

django分页优化参见:

https://blog.csdn.net/u011519550/article/details/98469725

进行完上面的优化后,页面加载时间大概需要6秒。

之后又将机器和编辑用的表分开,编辑的表很小,这样其实前面的sql耗时几乎可以忽略了。但是页面加载时间仍然需要6秒左右。

最后又定位了调用外部接口的一个字段需要四五秒。

因为字段是同步调用的,每个列表页二十个,每个调用大概0.2秒。加起来时间就久了。最终我的解决方法就是利用多线程同时请求接口获取数据。

核心就是重写ChangeList的get_results方法,拿到20个model对象后,开启20个线程调用接口获取数据,存入缓存,渲染字段时直接从缓存中拿数据。ps:这是难得不百度(貌似是没百度到。。。),自己搞定的东西。。。所以看源码还是有用的

from django.contrib.admin.views.main import ChangeList

class ChangeListAdmin(ChangeList):
    def get_results(self, request):
        thread_list = []
        #get all of model object from current page list
        super(ChangeListAdmin, self).get_results(request)
        for model in self.result_list:
            t = Thread(target=self.get_ctr, args=(model,))
            t.start()
            thread_list.append(t)
        for t in thread_list:
            t.join()

因为重写了ChangeList,所以admin.py中注意重写get_changelist方法,用我们自己重写的ChangeListAdmin类

def get_changelist(self, request, **kwargs):
    return ChangeListAdmin

做完这个优化后,调用接口的时间缩小到1秒多了。

但是有时候调用接口会timeout,索性直接不调接口直接查询数据库了,应该是56核 256G内存的服务器性能比较强劲,直接查数据库后获取这20个字段的时间基本缩小到0.5秒内了。

现在整个页面打开只需要1秒左右了。

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值