python-多线程
首先了解多线程之前先科普一下并发以及并行的概念,这两者大家很容易混淆.
一,意思不同
1、并发:并发是指两个或多个事件在同一时间间隔发生。
2、并行:并行是指两个或者多个事件在同一时刻发生。
二,处理方式不同
1、并发:并发在一台处理器上同时处理多个任务。
2、并行:并行在多台处理器上同时处理多个任务。
三,python 不能处理并行只能处理并发场景
在跑python代码时我们可以开很多个线程让他们并发执行,但是这个并发只能在该进程被分配的CPU上运行也就是说只能有一个CPU在跑这个线程。
这是因为python有一个全局解释器锁GIL。每个线程都要先取得这个锁才能被CPU调用运行,那么,什么是 GIL 呢?GIL 是最流程的 CPython 解释器
(平常称为 Python)中的一个技术术语,中文译为全局解释器锁,其本质上类似操作系统的 Mutex。GIL 的功能是:在 CPython 解释器中执行的每
一个 Python 线程,都会先锁住自己,以阻止别的线程执行。
python 多线程:
线程是CPU分配资源的基本单位。当一程序开始运行,这个程序就变成了一个进程,而一个进程相当于一个或者多个线程,程序的运行速度可能加快
多线程的创建方式:
1.from threading import Thread :通过导入threading 模块中的Thread 类创建
2.threading.Thread :可以通过类的继承方式进行创建
Thread创建线程的初始化参数:
1.target:指定线程执行的任务函数
2.name: 给线程起的名字 (默认的线程命名:Thread-1,Thread-2....)
3.daemon: 是否设置为守护线程
守护线程:主线程(主程序)执行结束,不管线程中的任务是否执行完毕 强制关闭线程
4.args:给任务函数传参 (位置参数)
5.kwargs:给任务函数传参(关键字参数)
Thread内置方法:
1.starat方法:开始线程活动
它在一个线程里最多只能被调用一次。它安排对象的 run()
方法在一个独立的控制进程中调用。如果同一个线程对象中调用这个方法的次数大于一次,
会抛出 RuntimeError
。
2.run方法:
代表线程活动的方法。
你可以在子类型里重载这个方法。 标准的 run()
方法会对作为 target 参数传递给该对象构造器的可调用对象(如果存在)发起调用,并附带从 args 和
kwargs 参数分别获取的位置和关键字参数。
3.join方法: 线程等待的方法
join
(timeout=None)
等待,直到线程终结。这会阻塞调用这个方法的线程,直到被调用 join()
的线程终结 -- 不管是正常终结还是抛出未处理异常 -- 或者直到发生超时,超时
选项是可选的。
一,通过第一种方式实现多线程任务执行
实例:不使用多线程执行任务,所有事物处理花费的时间总共11秒左右处理完毕
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 | # 新建两个任务,我们看下两个运行完成所需要花费的时间 def work(name): for i in range ( 5 ): print (f "{name}------正在做事情1------" ) time.sleep( 1 ) def task2(name): for i in range ( 6 ): print (f "{name}-----正在做事情2------" ) time.sleep( 1 ) start_time = time.time() work( "张三" ) work1( "李四" ) end_time = time.time() print ( "===============运行结束================" ) print (end_time - start_time) = = = = = = = = = = = = = = = = = = = = = 运行结果 = = = = = = = = = = = = = = = = = = = = = = = = 张三 - - - - - - 正在做事情 1 - - - - - - 张三 - - - - - - 正在做事情 1 - - - - - - 张三 - - - - - - 正在做事情 1 - - - - - - 张三 - - - - - - 正在做事情 1 - - - - - - 张三 - - - - - - 正在做事情 1 - - - - - - 李四 - - - - - 正在做事情 2 - - - - - - 李四 - - - - - 正在做事情 2 - - - - - - 李四 - - - - - 正在做事情 2 - - - - - - 李四 - - - - - 正在做事情 2 - - - - - - 李四 - - - - - 正在做事情 2 - - - - - - 李四 - - - - - 正在做事情 2 - - - - - - = = = = = = = = = = = = = = = = = = = 运行结束 = = = = = = = = = = = = = = = = = = = = = = 11.03499460220337 |
例: 使用多线程执行任务,本身单任务的执行方法,两条任务执行完成的时间11秒多,但是多线程的模式可以最多6秒钟执行完毕,
每条线程执行不同的任务.
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 | # ===========通过多线程实现多任务运行的模式================ def work(name): for i in range ( 5 ): print (f "{name}------正在做事情1------" ) time.sleep( 1 ) def work1(name): for i in range ( 6 ): print (f "{name}-----正在做事情2------" ) time.sleep( 1 )a = Thread(target = work,args = ( "张三" ,)) b = Thread(target = work1,kwargs = { "name" : "李四" })start_time = time.time()a.start()<br>b.start()<br>b.join() # 设置子线程等待,等子线程执行完成之后执行主线程end_time = time.time()<br>print(f"运行时间 : {end_start - start_time}")<br> = = = = = = = = = = = = = = = = = = = 输出结果 = = = = = = = = = = = = = = = = = = = = = = = = 张三 - - - - - - 正在做事情 1 - - - - - - 李四 - - - - - 正在做事情 2 - - - - - - 张三 - - - - - - 正在做事情 1 - - - - - - 李四 - - - - - 正在做事情 2 - - - - - - 张三 - - - - - - 正在做事情 1 - - - - - - 李四 - - - - - 正在做事情 2 - - - - - - 张三 - - - - - - 正在做事情 1 - - - - - - 李四 - - - - - 正在做事情 2 - - - - - - 李四 - - - - - 正在做事情 2 - - - - - - 张三 - - - - - - 正在做事情 1 - - - - - - 李四 - - - - - 正在做事情 2 - - - - - - <br><br>运行时间 : 6.039487600326538 |
二,通过第二种继承的方式实现多线程执行,run方法是Thread里面的任务执行方法,可以通过在子类从写父类的run的执行任务.
"=======通过继承父类的方式实现多线程===============" class Test(Thread): def run(self): for i in range(6): print("执行工作1") a = Test() b = Test() a.start() b.start() "=================输出结果==================" 执行工作1 执行工作1 执行工作1 执行工作1 执行工作1 执行工作1 执行工作1 执行工作1 执行工作1 执行工作1 执行工作1 执行工作1
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix