需求: 需要请求数据库中 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")
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.