探索flutter框架开发的app在移动应用市场的潜力与挑战
796
2022-09-10
python 线程创建和传参(28)(python能做什么)
在以前的文章中虽然我们没有介绍过线程这个概念,但是实际上前面所有代码都是线程,只不过是单线程,代码由上而下依次执行或者进入main函数执行,这样的单线程也称为主线程。
有了单线程的话,什么又是多线程?可以这么理解:一个线程执行一个代码块,多个线程可以同时执行多个代码,使用多线程能让程序效率更高。举个例子,你今天有两件事需要完成,分别是洗衣服和打扫房间,分别来看看单线程和多线程如何完成:
单线程:先用洗衣机洗衣服30分钟,等衣服洗完之后再打扫房间60分钟,累计总耗时:90分钟;
多线程:把衣服放到洗衣机并且30分钟后自动结束,然后立刻开始打扫房间60分钟,累计耗时:60分钟;
由此可见,完成同样的事情,单线程是一件事情做完之后继续下一件事情,而多线程可以同时执行多件事情,所以多线程比单线程效率更高!
一.线程解释
线程是cpu最小调度单位,一个程序中至少有一个或者多个线程(至于进程暂时不做讲解,后面文章会有详细解释)!在开发中使用线程可以让程序运行效率更高,多线程类似于同时执行多个不同代码块。
二.线程创建和启动
1.导入线程模块
# 导入线程threading模块
import threading
2.创建线程并初始化线程
调用threading模块中的缺省函数Thread,创建并初始化线程,返回线程句柄。如果对缺省函数已经忘记的小伙伴请回到 python函数的声明和定义中关于缺省参数部分复习一下。
# 创建并初始化线程,返回线程句柄
t = threading.Thread(target=函数名)
3.启动线程
通过初始化返回的线程句柄调用start()函数,启动线程,此时会自动执行在创建线程时target对应的函数内部的代码:
# 启动线程
t.start()
综合上面三步,下面使用代码对python线程thread做详细讲解:
输出结果:
洗衣服开始...
打扫房间开始...
洗衣服完成...
打扫房间完成...
运行程序可以发现程序从运行开始到结束,一共耗时5秒时间!注意观察输出日志:
第一步:洗衣服开始和打扫房间开始几乎同时开始,两个事件同时执行.
第二步:程序停止5秒;
第三步:洗衣服和打扫房间几乎同时完成
当然你也可以按照以前的学习的内容,先调用wash_clothes函数,在调用clean_room函数,同样能输出内容,而耗时却是10秒左右,示例代码如下:
输出结果:
洗衣服开始...
洗衣服完成...
打扫房间开始...
打扫房间完成...
运行程序可以发现程序从运行开始到结束,一共耗时10秒时间!注意观察输出日志:
第一步:洗衣服开始;
第二步:程序停止了5秒;
第三步:洗衣服完成,打扫房间开始
第四步:程序停止5秒;
第五步:打扫房间结束,程序结束;
由此可见:多线程可以同时运行多个任务,效率远比单线程更高!
三.线程传参
在上面的例子中,我们并没有为线程传递参数,如果在线程中需要传递参数怎么办呢?
threading.Thread()函数中有两个缺省参数 args 和 kwargs ,args 是元组类型,kwargs 是字典类型,缺省值默认为空,除此之外,其实还可以设置线程的名字等,其函数声明如下:
(ps:如果对缺省函数已经忘记的小伙伴请回到 python函数的声明和定义中关于缺省参数部分复习一下)
示例代码如下:
四.线程结束
值得思考的是:在上面这份代码中一共有几个线程呢?并非两个,一共是三个线程:
线程一:__name__ == “__main__” 作为主线程;
线程二:t1 作为子线程;
线程三:t2 作为子线程;
注意:主程序会等待所有子程序结束之后才会结束!
五.相关函数介绍
1.threading.Thread() — 创建线程并初始化线程,可以为线程传递参数 ;
2.threading.enumerate() — 返回一个包含正在运行的线程的list;
3.threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果;
4.Thread.start() — 启动线程 ;
5.Thread.join() — 阻塞函数,一直等到线程结束为止 ;
6.Thread.isAlive() — 返回线程是否活动的;
7.Thread.getName() — 返回线程名;
8.Thread.setName() — 设置线程名;
9.Thread.setDaemon() — 设置为后台线程,这里默认是False,设置为True之后则主线程不会再等待子线程结束才结束,而是主线程结束意味程序退出,子线程也立即结束,注意调用时必须设置在start()之前;
简单的示例代码:
输出结果:
六.重点总结
1.默认主线程会等待所有子线程结束之后才会结束,主线程结束意味着程序退出;如果setDaemon设置为True,主线程则不会等待子线程,主线程结束,子线程自动结束;
2.threading模块除了以上常用函数,还有互斥锁Lock/事件Event/信号量Condition/队列Queue等,由于篇幅有限,后面文章再一一讲解!!
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~