欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-04-21 23:48:23
...

之前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秒左右了。