django后台加载从15秒优化到1秒的过程⼩记
之前django的后台管理的管理的项⽬很慢,打开个页⾯得花⼗⼏秒甚⾄⼆⼗秒,经过不断努⼒优化,终于优化到1秒左右了,很舒服。
先定位慢的主要原因,⾸先有个表⼤概有200万条数据,⽽且机器每天不停地写⼊,增长很快。再利⽤diango-debug-toolbar很⽅便查看出哪些东西耗时,主要查看各种耗时的sql语句。
主要耗时的部分包括:django分页,list_filter,date_hierarchy,有个字段调⽤第三⽅接⼝
list_filter,date_hierarchy优化参见:
django分页优化参见:
进⾏完上⾯的优化后,页⾯加载时间⼤概需要6秒。
之后⼜将机器和编辑⽤的表分开,编辑的表很⼩,这样其实前⾯的sql耗时⼏乎可以忽略了。但是页⾯加载时间仍然需要6秒左右。
最后⼜定位了调⽤外部接⼝的⼀个字段需要四五秒。
因为字段是同步调⽤的,每个列表页⼆⼗个,每个调⽤⼤概0.2秒。加起来时间就久了。最终我的解决⽅法就是利⽤多线程同时请求接⼝获取数据。
核⼼就是重写ChangeList的get_results⽅法,拿到20个model对象后,开启20个线程调⽤接⼝获取数据,存⼊缓存,渲染字段时直接从缓存中拿数据。ps:这是难得不百度(貌似是没百度到。。。),⾃⼰搞定的东西。。。所以看源码还是有⽤的
ib.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 sult_list:
t = Thread(_ctr, args=(model,))
django admin 自定义页面
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秒左右了。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。