python多线程读取数据用不用锁_Python线程,以及多线程带来的数据错乱和死锁的解决方法...

本文介绍了Python中的多线程编程,包括threading模块的使用,如Thread类的创建、线程状态的判断以及线程的启动和关闭。此外,还探讨了在多线程环境下数据错乱的问题,提出了线程锁作为解决方案,通过示例展示了如何使用Lock防止数据错乱,确保线程安全。
摘要由CSDN通过智能技术生成

摘至本人有道云笔记《Python线程》python

1.python多线程的建立

在Python中,一样能够实现多线程,有两个标准模块thread和threading,不过咱们主要使用更高级的threading模块编程

threading模块提供的类:

Thread, Lock, Rlock, Condition, [Bounded]Semaphore, Event, Timer, local。多线程

threading 模块提供的经常使用方法:

threading.currentThread(): 返回当前的线程变量。 ui

threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。 spa

threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。线程

threading 模块提供的常量:

threading.TIMEOUT_MAX 设置threading全局超时时间3d

Thread类

Thread是线程类,有两种使用方法,直接传入要运行的方法或从Thread继承并覆盖run()对象

1)将要执行的方法做为参数传给Thread的构造方法blog

9d7980e17ec8652b6554e0ea5c897ab6.png

构造方法: 继承

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)(默认)前台线程,主线程执行过程当中,前台线程也在进行,主线程执行完毕后,等待前台线程也执行完成后,主线程中止。

使用循环建立多线程

e7f12bd8384b954f0073bafc1ef13767.png

32f28fd317cbec8088667301a6516401.png

例2:继承线程类,子类建立线程

be04a43a96da73e836516ed4dd4644b1.png

使用此方法建立线程,注意两点:

1)重写父类的__init__方法,并调用父类的__init__方法

2)实例化子类对象就是建立子线程,使用子线程对象m的start方法启动的是,子类里的run方法(线程要作的事)。

2.线程锁和ThreadLocal

1)线程锁

因为多个线程之间能够共享数据,那随之而来的问题就是:多个线程同时更改一个变量、使用一个资源时,就会出现数据错乱、死锁等现象。

下面是数据错乱的例子:

理论上若是顺序执行,change方法的每次计算结果都是0。因为两个线程都在同时访问change方法,就会形成数据错乱。

24382217ce217420f9f62a727a159609.png

394190b66477bc0c1022d6429ed0c47a.png

对于该问题,出现了Lock。 当访问某个资源以前,用Lock.acquire()锁住资源,访问以后,用Lock.release()释放资源。

得到锁的线程用完后必定要释放锁,不然那些苦苦等待锁的线程将永远等待下去,成为死线程。因此用try...finally来确保锁必定会被释放。

38bc4f8df3f2ff7356c268d71ffdc627.png

58219fb45ed89ad77c727013a0079855.png

多线程编程,模型复杂,容易发生冲突,必须用锁加以隔离,同时,又要当心死锁的发生。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值