码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • python多线程技术(Threading)


    文章目录

    • 前言
    • 一、多线程(Threading)是什么?
    • 二、threading库
      • 1.初识多线程
      • 2.增加新线程
        • 2.1 多线程的基本使用
        • 2.2 对多线程是同时进行的进行一个直观上的演示(非重点--理解是实时就行)
        • 2.3 thread.join()功能
        • 2.4 使用queue(队列)功能获取多线程的返回值(重要,这就是前面那个例子怎么用多线程处理一个很大很大的数据(分成小数据集用多线程)的模板)
          • 示例1:输出不一定按顺序的草稿,不完整的模板
          • 示例2:有输出顺序的标准模板
        • 2.5 多线程的锁(lock)功能(保护共享内存的安全性)
          • 示例1:join功能在join前半段仍然是所有线程一起交替进行
          • 示例2:lock对象的使用
        • 2.6 python多线程的假多线程机制 ---- 假的多线程(通过不断切换线程,给一种多线程同时进行的假象)
    • 总结


    前言

    多线程技术可以帮助我们加速python的工作效率。看本文前建议先看python传参这篇文章,有一点小小的知识点需要知道才好理解lock功能哪里的维护共享内存的安全性。

    一、多线程(Threading)是什么?

    多线程是什么我也问过chatgpt,但是同样是给出了一种摸棱两可的官方语言,看不懂。这里就我个人的理解来讲讲什么是多线程。其实多线程用一个实际中的例子就很好理解了,假设现实中有一份工作,一个人做完成所花费的时间太长,作为老板的你受不了了,怎么办呢?请人,多找几个打工仔不就可以缩短了时间。这就是一个典型的多线程,每个打工仔就是一个线程。下面回到计算机中,有一份很大的数据,你嫌弃python处理的太慢了,于是你将这份很大的数据拆分成5个小数据,然后分配5个进程让python同时处理这5份小数据,理论上速度一下就提升了5倍。这就是多线程,简单理解就是让python在同一时间可以干多件事情。可以在同一个时间内运行多个程序,但是还是在同一个脚本中,这就是python多线程。
    【注】:但是python里面多线程其实本质上是一个假的多线程,的确是在同一时间干多件事情,但是它是在不断的反复切换线程来实现的,所以从理论上来说速度是不会有加快的(应该是时间差不多,或者快一点)。但是同一个时间干多件事情这个功能还是要经常用到的,所以不要想着用python多线程加速了,能让你在同一时间干不同的事情已经够不错了。
    如果需要加速需要使用多进程功能,后面博客里面会写,在这里加上链接。

    二、threading库

    下面演示怎么使用threading使用python多线程功能

    1.初识多线程

    function 功能
    threading.active_count() 返回当前活动的线程数
    threading.enumerate() 返回当前活动的线程列表
    threading.current_thread() 返回当前线程对象
    import threading
    def main():
        print(threading.active_count())  # 返回当前活动的线程数
        print(threading.enumerate())     # 返回当前活动的线程列表
        print(threading.current_thread())   # 返回当前线程对象
    
    if __name__ == '__main__':
        main()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    输出:
    在这里插入图片描述
    可以看到,目前显示有6个线程在运行中,其中画线的main就是我们mian函数运行的线程,并且可以看到当前正在运行的线程对象就是我们刚定义的main函数。线程对象列表里面其他几个线程不用管,应该是编辑器或者环境开启就有了的。
    这么一看,我们可以将一个线程绑定一个python里面某个功能的主函数,那个这个线程就会干那个主函数干的活了。

    2.增加新线程

    可以看到上面main函数还是在一个脚本里面干一件事啊,如果要同时干第二件事怎么办,那就要添加新线程,并将其绑定到我们需要干的另一个主函数上,下面继续演示。

    2.1 多线程的基本使用

    import threading
    def main():
        add_thread = threading.Thread(target=another_main, name='thread2')    # 创建线程,并于another_main函数绑定
        add_thread.start()  # 启动线程
        print(threading.active_count())  # 返回当前活动的线程数
        print(threading.enumerate())     # 返回当前活动的线程列表
        print(threading.current_thread())   # 返回当前线程对象
        
    def another_main():
    	# 定义另一件事情
        print('-------another_main---------')
        while True:
            # while循环是为了让线程一直运行,不然线程会自动结束,便于观察线程的状态
            a=1 
    
    if __name__ == '__main__':
        main()      
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    输出:
    在这里插入图片描述
    可以看到输出了another_main干的事情,线程数由6变成了7,并且线程列表里面增加了名为thread2的新线程。
    实现了在做main里面的事情的同时还在做another_main的事情。
    【注】:这和在main里面直接调another_main不一样,直接调这两件事情是有一个先后顺序的,是在共用一个线程;但如果是another_main绑定上一个新线程,那么这两件事情就是平级关系,同时在干。

    有没有发现上面演示的没有穿参数进去,如果要传参又应该怎么办呢!python里面传函数是不能带括号()的,似乎麻烦了。放心了,怎么可能开发者没有想到这一点呢,在给一个参数传参数不就可以了,嘿嘿!

    import threading
    
    def main():
        # 创建线程并传递字符串和数字参数
        thread = threading.Thread(target=another_main, args=('Hello', 123))
        thread.start()
        print("Main thread is done!")
    
    def another_main(string_param, int_param):
        # 打印接收到的参数
        print("Received string parameter:", string_param)
        print("Received integer parameter:", int_param) 
    
    if __name__ == '__main__':
        main()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    输出:
    在这里插入图片描述

    2.2 对多线程是同时进行的进行一个直观上的演示(非重点–理解是实时就行)

    上面由于another_main功能几乎是瞬时完成的,根本显示不出来这个同时性,反而像是直接调用打印一样。所以这里用time库进行一个直观上的演示。

    import threading
    import time
    
    def main():
        # 创建线程并传递字符串和数字参数
        thread = threading.Thread(target=another_main)
        thread.start()
        print("Main thread is done!")
    
    def another_main():
        print('新thread started') # 打印线程开始
        for i in range(10):
            time.
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
  • 相关阅读:
    【附源码】计算机毕业设计SSM数据分析教学网站
    .Net平台
    深入了解RTMP推流技术:视频汇聚EasyCVR低延迟与高稳定性分析
    kubernetes-Service服务发现
    软件工程导论---极限编程
    用Roslyn玩转代码之一: 解析与执行字符串表达式
    R语言拟合ARIMA模型:使用forecast包中的auto.arima函数自动搜索最佳参数组合、模型阶数(p,d,q)
    外包干了3个多月,技术退步明显。。。。
    第六次面试、第一次复试
    [足式机器人]Part3机构运动微分几何学分析与综合Ch02-1 平面机构离散运动鞍点综合——【读书笔记】
  • 原文地址:https://blog.csdn.net/smalltorch/article/details/137959153
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号