python线程(二)代码部分Threading模块
一、threading类简介
1、threading.Thread类参数简介
class threading.Thread(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)
group:目前此参数为None,在实现ThreadGroup类时为将来的扩展保留。
target:target接收的是一个函数的地址,由run()方法调用执行函数中的内容。默认为无,表示未调用任何内容。
name :线程名,可自行定义。
args:target接收的是函数名,此函数的位置参数以元组的形式存放在args中,用于执行函数时调用。
kwargs :target接收的是函数名,此函数的关键字参数以字典的形式存放在kwargs中,用于执行函数时调用。
daemon:如果为True表示该线程为守护线程。
2、threading.Thread类的常用方法
start():开启线程,一个Thread对象只能调用一次start()方法,如果在同一线程对象上多次调用此方法,则会引发RuntimeError。
run():执行start()方法会调用run(),该方将创建Thread对象时传递给target的函数名,和传递给args、kwargs的参数组合成一个完整的函数,并执行该函数。run()方法一般在自定义Thead类时会用到。
join(timeout=None):join会阻塞、等待线程,timeout单位为秒,因为join()总是返回none,所以在设置timeout调用join(timeout)之后,需要使用isalive()判断线程是否执行完成,如果isalive为True表示线程在规定时间内没有执行完,线程超时。如果join(timeout=None)则会等待线程执行完毕后才会执行join()后面的代码,一般用于等待线程结束。
name:获取线程名。
getName():获取线程名。
setName(name):设置线程名。
ident:“线程标识符”,如果线程尚未启动,则为None。如果线程启动是一个非零整数。
is_alive():判断线程的存活状态,在run()方法开始之前,直到run()方法终止之后。如果线程存活返回True,否则返回False。
daemon:如果thread.daemon=True表示该线程为守护线程,必须在调用Start()之前设置此项,否则将引发RuntimeError。默认为False
isDaemon():判断一个线程是否是守护线程。
setDaemon(daemonic):设置线程为守护线程。
二、threading.Thread的简单使用
创建线程:
由上面的打印内容我们可以看出,在执行完所有线程后才执行的主线程print。如果是多进程的话会先执行主进程中的print然后才会执行子进程的print。主要是因为开启进程相比于开启线程更加耗费时间。
自定义线程类
多进程和多线程的效率对比
守护线程
主线程会等待所有非守护线程执行完毕后,才结束主线程。主进程是进程内的代码结束后就结束主进程。
对比守护进程,代码执行完毕后立即关闭守护进程,因为在主进程看来代码执行完毕,主进程结束了,所以守护进程在代码结束后就被结束了。
只打印了主进程,也就是说守护进程还没来得及执行程序就结束了。
也许你会说是由于线程太快了,所以才执行了守护线程。下面我们在线程中阻塞一段时间,在来看看会发生什么效果。
守护线程还是被执行了,如果是守护进程,守护进程里的代码是不会被执行的。
线程锁Lock
Lock也称线程同步锁,互斥锁,原子锁,该对象只有两个方法:
acquire(blocking=True, timeout=-1):加锁。
timeout:设置加锁时间,单位为秒。-1表示一直等待线程release()后,才允许其它线程执行加锁的代码。
递归锁RLock
所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,出现了一种互相等待的情况,它们都将无法进行下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程,如下模拟产生死锁。
条件对象Condition(lock=None)
1、Condition类的方法
class threading.Condition([lock])
acquire():加锁、与Lock、RLock中的用法一致,这里不过多解释。
release():解锁、与Lock、RLock中的用法一致,这里不过多解释。
wait_for(predicate, timeout=None):这个不知道该如何解释。
notify(n=1):激活被挂起的线程,n表示激活n个被挂起的线程,注意:如果调用线程在调用此方法时未获取锁,则会引发RuntimeError。
notify_all():激活所有被挂起的线程,注意:如果调用线程在调用此方法时未获取锁,则会引发RuntimeError。。
2、下面是一个无聊的实例:
Threading类的方法:
threading.active_count
():获取当前活动的线程对象数量。
threading.current_thread
():获取当前的线程对象。如果调用方的控制线程不是通过线程模块创建的,则返回功能有限的虚拟线程对象。
threading.get_ident
():获取线程标识符。
threading.enumerate
():这个比较厉害,可以获取当前活动的所有线程对象的列表。该列表包括后台线程和使用current_thread()创建的虚拟线程。以列表的形式返回。
threading.main_thread
():获取主线程对象。
文章出自https://www.cnblogs.com/caesar-id/archive/2019/04/24/10764710.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Discourse 如何使用命令行方式进行恢复
- CentOS 8 Apache 启用 SSL
- leetcode栈之二叉树的前序遍历
- 前端学数据结构与算法(七): 从零实现优先队列-堆及其应用
- 前端学数据结构与算法(六):二叉树的四种遍历方式及其应用
- 前端学数据结构与算法(五):理解二叉树特性及从零实现二叉搜索树
- 前端学数据结构与算法(四):理解递归及拿力扣链表题目练手
- 前端学数据结构与算法(三):链表为什么能和数组相提并论?用链表实现数组bettle下
- 前端学数据结构与算法(二):数组的操作特性与栈的应用
- 前端学数据结构与算法(一):不会复杂度分析,算法等于白学
- 高可扩展性系统的设计
- Vue如何实现导出页面为PDF
- 短视频APP开发,如何做到获取播放视频和音频文件
- 3分钟短文:Laravel模型创建数据条目的2个语法糖
- leetcode队列之最近的请求次数