Python_玩转多线程_一蓑烟雨任平生

玩转Python多线程



前言

很久不写博客了,但是看着粉丝和点赞数的增多,感觉也不能废弃我的博客哈,随便写点多线程的东西好了

在这里插入图片描述

多线程就是多个人干同个事,效率翻倍,你1个人吃一锅饭要1小时,10个人吃一锅饭可能就6分钟,缩短时间降低成本


当然可以看我之前那篇用队列来使用线程
点这里看往期回顾


一、线程池

python3内置的有Threadingpool和ThreadPoolExecutor模块,两个都可以做线程池,当然ThreadPoolExecutor会更好用一些,而且也有ProcessPoolExecutor进程池模块,使用方法基本一致。


二、使用步骤

1.引入库

代码如下:

from concurrent.futures imoprt ThreadPoolExecutor

2.测试时间

在这里插入图片描述

在这里插入图片描述

结论

使用线程池确实效率高了很多,这是测试打印数字,循环比较简单,实战中的计算远远不止几毫秒这么少

实战一下下

根据时间遍历视频地址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执行完就可以了,以此类推,时间是不是缩短了十倍???


总结

一名喜欢研究Python的Java程序猿( ̄▽ ̄)"

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值