python多线程队列文件_Python使用多线程,队列的方式快速获取数据

之前有个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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值