Python线程,以及多线程带来的数据错乱和死锁的解决方法
摘至本人有道云笔记《Python线程》
1.python多线程的创建
在Python中,同样可以实现多线程,有两个标准模块thread和threading,不过我们主要使用更高级的threading模块
threading模块提供的类:
Thread, Lock, Rlock, Condition, [Bounded]Semaphore, Event, Timer, local。
threading 模块提供的常用方法:
threading.currentThread(): 返回当前的线程变量。
threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。
threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。
threading 模块提供的常量:
threading.TIMEOUT_MAX 设置threading全局超时时间
Thread类
Thread是线程类,有两种使用方法,直接传入要运行的方法或从Thread继承并覆盖run()
1)将要执行的方法作为参数传给Thread的构造方法
构造方法:
Thread(group=None, target=None, name=None, args=(), kwargs={})
group: 线程组,目前还没有实现,库引用中提示必须是None;
target: 要执行的方法;
name: 线程名;
args/kwargs: 要传入方法的参数。
实例方法:
isAlive(): 返回线程是否在运行。正在运行指启动后、终止前。
get/setName(name): 获取/设置线程名。
is/setDaemon(bool): 获取/设置是后台线程(默认前台线程(False))。(在start之前设置)
如果是后台线程,主线程执行过程中,后台线程也在进行,主线程执行完毕后,后台线程不论成功与否,主线程和后台线程均停止
如果是前台线程,主线程执行过程中,前台线程也在进行,主线程执行完毕后,等待前台线程也执行完成后,程序停止
start(): 启动线程。
join([timeout]): 阻塞当前上下文环境的线程,直到调用此方法的线程终止或到达指定的timeout(可选参数)。
例1:验证了serDeamon(False)(默认)前台线程,主线程执行过程中,前台线程也在进行,主线程执行完毕后,等待前台线程也执行完成后,主线程停止。
使用循环创建多线程
例2:继承线程类,子类创建线程
使用此方法创建线程,注意两点:
1)重写父类的__init__方法,并调用父类的__init__方法
2)实例化子类对象就是创建子线程,使用子线程对象m的start方法启动的是,子类里的run方法(线程要做的事)。
2.线程锁和ThreadLocal
1)线程锁
由于多个线程之间可以共享数据,那随之而来的问题就是:多个线程同时更改一个变量、使用一个资源时,就会出现数据错乱、死锁等现象。
下面是数据错乱的例子:
理论上如果顺序执行,change方法的每次计算结果都是0。由于两个线程都在同时访问change方法,就会造成数据错乱。
对于该问题,出现了Lock。 当访问某个资源之前,用Lock.acquire()锁住资源,访问之后,用Lock.release()释放资源。
获得锁的线程用完后一定要释放锁,否则那些苦苦等待锁的线程将永远等待下去,成为死线程。所以用try...finally来确保锁一定会被释放。
多线程编程,模型复杂,容易发生冲突,必须用锁加以隔离,同时,又要小心死锁的发生。
Python线程,以及多线程带来的数据错乱和死锁的解决方法相关推荐
- oracle数据表造成死锁,解决方法
一.死锁的表现 1.错误信息是:事务(进程 ID)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品.请重新运行该事务. 2.错误信息是:事务(进程 ID )与另一个进程被死锁在 锁 | 通信缓 ...
- MySQL导出数据遇到secure-file-priv问题的解决方法
这篇文章主要为大家详细介绍了MySQL导出数据遇到secure-file-priv问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 ERROR 1290 (HY000): The My ...
- Hive之数据倾斜的原因和解决方法
数据倾斜 在做Shuffle阶段的优化过程中,遇到了数据倾斜的问题,造成了对一些情况下优化效果不明显.主要是因为在Job完成后的所得到的Counters是整个Job的总和,优化是基于这些Counter ...
- Java 线程实例一(查看线程是否存活、获取当前线程名称、状态监测、线程优先级设置、死锁及解决方法、获取线程id、线程挂起)
查看线程是否存活 以下实例演示了如何通过继承 Thread 类并使用 isAlive() 方法来检测一个线程是否存活: public class TwoThreadAlive extends Thre ...
- c mysql 插入大量数据_C++操作MySQL大量数据插入效率低下的解决方法
通常来说C++操作MySQL的时候,往Mysql中插入10000条简单数据,速度非常缓慢,居然要5分钟左右, 而打开事务的话,一秒不到就搞定了! 具体实现代码如下: #include #include ...
- mysql left join 右表数据不唯一的情况解决方法
mysql left join 右表数据不唯一的情况解决方法 参考文章: (1)mysql left join 右表数据不唯一的情况解决方法 (2)https://www.cnblogs.com/ne ...
- java json utf-8_java读取json数据发生中文乱码的解决方法
java读取json数据发生中文乱码的解决方法 发布时间:2020-06-21 15:58:48 来源:亿速云 阅读:268 作者:鸽子 java读取json数据出现乱码的代码://从json文件中读 ...
- Python中报错:IndentationError: unexpected indent的原因分析和解决方法
Python中报错:"IndentationError: unexpected indent"的原因分析和解决方法 "IndentationError: unexpect ...
- python 子线程coredump_python多线程备份mysql数据工具:mysqlpdump使用方法
mysql的备份工具有很多,但是很多都备份比较慢,那有没办法多线程进行备份呢?分享一个python多线程备份mysql数据工具:mysqlpdump使用方法: mysqlpdump自己的介绍: MyS ...
最新文章
- WIN7 64位系统下,右下角的声音和电源图标不见的解决办法
- 文件服务器的迁移(包括权限)
- sql is null优化_你不会还在用这8个错误的SQL写法吧?
- 进入环境_如何进入Windows恢复环境(WinRE)
- 50张非常精美的Apple主题桌面壁纸(上篇)
- SharePoint 2013 RBS(Remote BLOB Storag) 安装、部署、垃圾回收
- python二十四点_Python秒算24点,行还是不行?
- php 写入内存缓存,示例:通过内存缓存来提升性能
- 厚积薄发-Web安全
- 嗅探对方机器,获取机器键盘记录
- 【储留香系列】如何构建一个拖垮公司的备份系统
- 前端js遍历map获取key与value
- latex学习3:教你如何在word中像LaTex那样打公式
- MongoDB LBS经纬度查询操作
- 隔行插入行——《超级处理器》应用
- STM32F103C8T6基础开发教程(HAL库)—LED灯1S周期闪烁
- YOLOv7改进主干系列:首发结合最新 QARepVGG 升级Rep结构, 本文对其进行原创改进 QARepNeXt 结构,基于美团提出一种量化感知方法:再一次让 RepVGG 变得更好
- Poser v7.0 1DVD(3D 角色动画)
- 自考工作分析之工作分析的基础方法
- 联通云服务器安全性能怎么样,云安全解决方案
热门文章
- 交通换乘GIS地图应用解决方案
- 安装suse 15 sp4操作系统
- an初始java运行环境错误,完美解决jdk环境变量设置完后,在cmd中运行javac出现’javac‘不是内部或外部命令,也不是可运行的程序或批处理文件的错误提示...
- java基于ssm的疾病控制中心管理系统
- 关于对最新HTML总结PPT讲稿的分享
- 6个可以下载合同范本的网站,涵盖各岗各业,直接编辑使用
- IHE放射技术框架中的部门业务流程
- 『ML笔记』深入浅出字典学习1(Dictionary Learning)
- RocketMQ——查看死信队列
- 2017年蓝桥杯省赛 等差素数序列(暴力循环)