很久不写博客了,但是看着粉丝和点赞数的增多,感觉也不能废弃我的博客哈,随便写点多线程的东西好了
多线程就是多个人干同个事,效率翻倍,你1个人吃一锅饭要1小时,10个人吃一锅饭可能就6分钟,缩短时间降低成本
当然可以看我之前那篇用队列来使用线程
点这里看往期回顾
python3内置的有Threadingpool和ThreadPoolExecutor模块,两个都可以做线程池,当然ThreadPoolExecutor会更好用一些,而且也有ProcessPoolExecutor进程池模块,使用方法基本一致。
代码如下:
from concurrent.futures imoprt ThreadPoolExecutor
使用线程池确实效率高了很多,这是测试打印数字,循环比较简单,实战中的计算远远不止几毫秒这么少
根据时间遍历视频地址60*600=36000这个循环要循环将近四万次,如果不使用线程,跟使用线程,差距就大了
# -*- coding: utf-8 -*-
"""
@Time : 2022/9/6 12:46
@Auth : 一蓑烟雨任平生
@File :xiancheng.py
@IDE :PyCharm
@Motto:ABC(Always Be Coding)
"""
from concurrent.futures import ThreadPoolExecutor
from datetime import datetime
import requests
from future.backports.datetime import timedelta
def getStartTime(startTime):
date_1 = datetime.strptime(startTime, "%Y-%m-%d-%H:%M:%S") # 将字符串转换为时间格式
date_start = date_1 + timedelta(seconds=1)
date_start = date_start.strftime("%Y-%m-%d-%H:%M:%S")
return date_start
def getEndTime(endTime):
# date_1 = datetime.now() # 将字符串转换为时间格式
date_1 = datetime.strptime(endTime, "%Y-%m-%d-%H:%M:%S") # 将字符串转换为时间格式
date_start = date_1 + timedelta(seconds=1)
date_start = date_start.strftime("%Y-%m-%d-%H:%M:%S")
return date_start
def getCode(A, startTime, endTime):
for B in range(600): # 内层循环10分钟
NUM = A * 600 + B + 1
print(f'第{NUM}次验证,开始时间为{startTime},结束时间为{endTime}')
r = requests.get(
'http://v-replay-tx.cdn.huya.com/record/huyalive/1199578963347-1199578963347-5510819979982798848'
f'-2399158050150-10057-A-0-1/{startTime}_{endTime}.m3u8')
if r.status_code != 200:
# 结束时间+1秒 然后继续循环
endTime = getEndTime(endTime)
continue
else:
print("这是正确地址:")
print('http://v-replay-tx.cdn.huya.com/record/huyalive/1199578963347-1199578963347-5510819979982798848'
f'-2399158050150-10057-A-0-1/{startTime}_{endTime}.m3u8')
break
if __name__ == '__main__':
num = 10
startTime = "2022-08-29-01:36:00"
endTime = "2022-08-29-03:52:00"
with ThreadPoolExecutor(max_workers=num) as executor:
for A in range(60): # 外层循环一分钟
executor.submit(getCode, A, startTime, endTime);
startTime = getStartTime(startTime)
endTime = "2022-08-29-03:52:00"
print(f"\n---------------------------{num}条线程已启动----------------------------------\n")
十条线程,第一个线程只需要从1-600执行完就可以了,第二个线程从601-1200执行完就可以了,以此类推,时间是不是缩短了十倍???