需求: 需要请求数据库中 1 个月的带宽数据。
遇到问题: 我的思路是按天请求数据,一个月 30 天,for 语句循环 30 次连接数据库,每次时间大约是 0.6 秒左右,30 次大概是 20 秒,可以完成查询。但毕竟是展示数据,感觉 20 秒时间太长了,想要缩短到 10 秒内。
我的解决方式: 想利用 python 的多线程( threading ),如果能同时请求 5 天的数据那么速度就能降到 5 秒内。
我遇到的问题: 使用的多线程,但并没有使查询时间缩短。
我是用的框架:Django
我的视图函数代码(代码有点多,但啥好办法了,逻辑是没问题的,跑出结果 20 秒,和 for 没区别):
def cdn_detail(request):
""" 获取域名带宽 """ company_id = request.GET['company_id'] domain_id = request.GET['domain_id'].split(",") domain = request.GET['domain_id'] daterange = request.GET['daterange'].split(' ~ ') """ filter(xx__in = list) """ import datetime t1=time.time() def sql_execut(company_id,domain,date,backValue): with connection.cursor() as cursor: sql_select = f"SELECT timestrap, bps FROM cdn_bandwidth WHERE (company_id = {company_id} AND domain_id IN ({domain}) AND time >= '{date} 00:00:00' AND time <= '{date} 23:59:59')" cursor.execute(sql_select) row = cursor.fetchall() fr_row = pd.DataFrame(list(row), columns=['timestrap', 'bps']) backValue.put(fr_row) day_range = pd.date_range(start=daterange[0], end=daterange[1]).strftime("%Y-%m-%d").to_list()#创建日期范围 list import threading from queue import Queue threads =[] n = range(len(day_range)) backValue = Queue() frame = pd.DataFrame(columns=['timestrap', 'bps'])#建一个空 DataFrame for i in n: t=threading.Thread(target=sql_execut,args=(company_id,domain,day_range[i],backValue)) t.start() threads.append(t) for i in threads: i.join() for _ in n: frame = frame.append(backValue.get()).groupby('timestrap')['bps'].sum().reset_index() frame_sum = frame.values.tolist() t2=time.time() print("相差",(datetime.datetime.fromtimestamp(t2)-datetime.datetime.fromtimestamp(t1)).seconds,"秒") point = int(len(frame_sum)/100*95)#95 值的点 value_95 = sorted(frame_sum, key = lambda k:k[1])[point][1]#95 值 cOntext= { 'datas': frame_sum, 'value_95' : value_95 } datas = json.dumps(context, ensure_ascii=False) return HttpResponse(datas, content_type="application/json") 