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


    玩转Python多线程



    前言

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

    在这里插入图片描述

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


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


    一、线程池

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


    二、使用步骤

    1.引入库

    代码如下:

    from concurrent.futures imoprt ThreadPoolExecutor
    
    • 1

    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59

    在这里插入图片描述

    十条线程,第一个线程只需要从1-600执行完就可以了,第二个线程从601-1200执行完就可以了,以此类推,时间是不是缩短了十倍???


    总结

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

    在这里插入图片描述

  • 相关阅读:
    flask 自定义命令 sqllite /SQLAlchemy 简单使用
    人工智能在电气中的应用,电力电子与人工智能
    2024年天津中德应用技术大学专升本自动化专业基础考试大纲
    html实现图片裁剪处理(附源码)
    Spring面试题21:说一说Spring的@Required注解和@Qualifier注解
    CMake中list的使用
    android apk 加固后重新签名
    el-date-picker限制开始时间不能大于结束时间,且结束不能小于开始时间
    单目标应用:猎豹优化算法(The Cheetah Optimizer,CO)求解微电网优化MATLAB
    MySQL/MariaDB 查询某个 / 多个字段重复数据
  • 原文地址:https://blog.csdn.net/Jaeger_Java/article/details/126723020