摘至本人有道云笔记《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线程,以及多线程带来的数据错乱和死锁的解决方法相关推荐

  1. oracle数据表造成死锁,解决方法

    一.死锁的表现 1.错误信息是:事务(进程 ID)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品.请重新运行该事务. 2.错误信息是:事务(进程 ID )与另一个进程被死锁在 锁 | 通信缓 ...

  2. MySQL导出数据遇到secure-file-priv问题的解决方法

    这篇文章主要为大家详细介绍了MySQL导出数据遇到secure-file-priv问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 ERROR 1290 (HY000): The My ...

  3. Hive之数据倾斜的原因和解决方法

    数据倾斜 在做Shuffle阶段的优化过程中,遇到了数据倾斜的问题,造成了对一些情况下优化效果不明显.主要是因为在Job完成后的所得到的Counters是整个Job的总和,优化是基于这些Counter ...

  4. Java 线程实例一(查看线程是否存活、获取当前线程名称、状态监测、线程优先级设置、死锁及解决方法、获取线程id、线程挂起)

    查看线程是否存活 以下实例演示了如何通过继承 Thread 类并使用 isAlive() 方法来检测一个线程是否存活: public class TwoThreadAlive extends Thre ...

  5. c mysql 插入大量数据_C++操作MySQL大量数据插入效率低下的解决方法

    通常来说C++操作MySQL的时候,往Mysql中插入10000条简单数据,速度非常缓慢,居然要5分钟左右, 而打开事务的话,一秒不到就搞定了! 具体实现代码如下: #include #include ...

  6. mysql left join 右表数据不唯一的情况解决方法

    mysql left join 右表数据不唯一的情况解决方法 参考文章: (1)mysql left join 右表数据不唯一的情况解决方法 (2)https://www.cnblogs.com/ne ...

  7. java json utf-8_java读取json数据发生中文乱码的解决方法

    java读取json数据发生中文乱码的解决方法 发布时间:2020-06-21 15:58:48 来源:亿速云 阅读:268 作者:鸽子 java读取json数据出现乱码的代码://从json文件中读 ...

  8. Python中报错:IndentationError: unexpected indent的原因分析和解决方法

    Python中报错:"IndentationError: unexpected indent"的原因分析和解决方法 "IndentationError: unexpect ...

  9. python 子线程coredump_python多线程备份mysql数据工具:mysqlpdump使用方法

    mysql的备份工具有很多,但是很多都备份比较慢,那有没办法多线程进行备份呢?分享一个python多线程备份mysql数据工具:mysqlpdump使用方法: mysqlpdump自己的介绍: MyS ...

最新文章

  1. WIN7 64位系统下,右下角的声音和电源图标不见的解决办法
  2. 文件服务器的迁移(包括权限)
  3. sql is null优化_你不会还在用这8个错误的SQL写法吧?
  4. 进入环境_如何进入Windows恢复环境(WinRE)
  5. 50张非常精美的Apple主题桌面壁纸(上篇)
  6. SharePoint 2013 RBS(Remote BLOB Storag) 安装、部署、垃圾回收
  7. python二十四点_Python秒算24点,行还是不行?
  8. php 写入内存缓存,示例:通过内存缓存来提升性能
  9. 厚积薄发-Web安全
  10. 嗅探对方机器,获取机器键盘记录
  11. 【储留香系列】如何构建一个拖垮公司的备份系统
  12. 前端js遍历map获取key与value
  13. latex学习3:教你如何在word中像LaTex那样打公式
  14. MongoDB LBS经纬度查询操作
  15. 隔行插入行——《超级处理器》应用
  16. STM32F103C8T6基础开发教程(HAL库)—LED灯1S周期闪烁
  17. YOLOv7改进主干系列:首发结合最新 QARepVGG 升级Rep结构, 本文对其进行原创改进 QARepNeXt 结构,基于美团提出一种量化感知方法:再一次让 RepVGG 变得更好
  18. Poser v7.0 1DVD(3D 角色动画)
  19. 自考工作分析之工作分析的基础方法
  20. 联通云服务器安全性能怎么样,云安全解决方案

热门文章

  1. 交通换乘GIS地图应用解决方案
  2. 安装suse 15 sp4操作系统
  3. an初始java运行环境错误,完美解决jdk环境变量设置完后,在cmd中运行javac出现’javac‘不是内部或外部命令,也不是可运行的程序或批处理文件的错误提示...
  4. java基于ssm的疾病控制中心管理系统
  5. 关于对最新HTML总结PPT讲稿的分享
  6. 6个可以下载合同范本的网站,涵盖各岗各业,直接编辑使用
  7. IHE放射技术框架中的部门业务流程
  8. 『ML笔记』深入浅出字典学习1(Dictionary Learning)
  9. RocketMQ——查看死信队列
  10. 2017年蓝桥杯省赛 等差素数序列(暴力循环)