之前有个Python的小测试,要求在5秒内请求完以下Api并返回数据,当时我看了线程的方式但就是不行,今天稍微系统的研究一下,成功得到我预期的效果
普通方式
循环一个一个的去请求返回数据
import requests
import time
date_list = ['http://0.0.0.0:5000/attendances?date=2019-07-11', 'http://0.0.0.0:5000/attendances?date=2019-07-12', 'http://0.0.0.0:5000/attendances?date=2019-07-13',
'http://0.0.0.0:5000/attendances?date=2019-07-14', 'http://0.0.0.0:5000/attendances?date=2019-07-15', 'http://0.0.0.0:5000/attendances?date=2019-07-16',
'http://0.0.0.0:5000/attendances?date=2019-07-17', 'http://0.0.0.0:5000/attendances?date=2019-07-18', 'http://0.0.0.0:5000/attendances?date=2019-07-19',
'http://0.0.0.0:5000/attendances?date=2019-07-20', 'http://0.0.0.0:5000/attendances?date=2019-07-21', 'http://0.0.0.0:5000/attendances?date=2019-07-22',
'http://0.0.0.0:5000/attendances?date=2019-07-23', 'http://0.0.0.0:5000/attendances?date=2019-07-24']
for i in url_list:
res = requests.get(i)
if res.status_code == 200:
print(res.text)
print("{} Done ({}ms)".format(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), int(time.perf_counter() * 1000)), end="\n")
耗时 14435毫秒 也就是14秒左右,太慢了不是我们想要的
14435ms
多线程,队列 方式
启用多线程访问api数据,因为多线程无法给我们return一个数据回来,所以我们要用队列
from queue import Queue
import threading
import requests
import time
# 请求api返回数据
def get_api_data(url, q):
try:
r = requests.get(url)
if r.status_code == 200:
q.put(r.text) # 把返回的数据放入队列中
except Exception as e:
print("[ERROR -2]: {error}".format(error=e))
def main():
q = Queue() # 创建队列
threads = []
date_list = ['http://0.0.0.0:5000/attendances?date=2019-07-11', 'http://0.0.0.0:5000/attendances?date=2019-07-12', 'http://0.0.0.0:5000/attendances?date=2019-07-13',
'http://0.0.0.0:5000/attendances?date=2019-07-14', 'http://0.0.0.0:5000/attendances?date=2019-07-15', 'http://0.0.0.0:5000/attendances?date=2019-07-16',
'http://0.0.0.0:5000/attendances?date=2019-07-17', 'http://0.0.0.0:5000/attendances?date=2019-07-18', 'http://0.0.0.0:5000/attendances?date=2019-07-19',
'http://0.0.0.0:5000/attendances?date=2019-07-20', 'http://0.0.0.0:5000/attendances?date=2019-07-21', 'http://0.0.0.0:5000/attendances?date=2019-07-22',
'http://0.0.0.0:5000/attendances?date=2019-07-23', 'http://0.0.0.0:5000/attendances?date=2019-07-24']
for i in range(len(date_list)):
t = threading.Thread(target=get_api_data, args=(date_list[i], q)) # 定义多线程,把我们的url传给获取api数据的方法
t.start() # 启动
threads.append(t)
time.sleep(0.2)
for thread in threads:
thread.join()
for _ in range(len(date_list)):
result = q.get() # 线程结束后,再从队列里面把数据拿出来
print(result)
if __name__ == '__main__':
main()
print("{} Done ({}ms)".format(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), int(time.perf_counter() * 1000)), end="\n")
耗时 3862毫秒 也就是三秒多,是我们预期的效果,如果要写数据到数据库中的话,其实还是不能控制在4秒以内,不过还是可以解决的,那就是把写数据库也放在多线程里面,就OK了
3862ms