您的位置:首页 > 编程语言 > Python开发

Python学习笔记【week04day4】创建线程的3种方式,多线程,线程冲突,互斥锁,递归锁,信号量

2019-06-29 16:25 661 查看

创建线程的3种方式,多线程,线程冲突,互斥锁,递归锁,信号量

创建线程的3种方式

  1. 守护线程 _thread
    子线程会随着主线程的结束而结束。

2.线程创建的方式二:threading

  1. 线程创建的方式三:threading class方式创建重写run方法 

注意一般情况下使用第二种创建方式比较常用

threading常用方法:

多线程

一个进程运行时产生了多个线程。

线程冲突

多个线程并发访问同一个变量而相互干扰
e.g. cpu分配的时间片不足以完成一百万次的加法运算,因此,数据还没有被保存,就被其他的线程打断了。
解决方式:线程锁(互斥锁)

线程锁(互斥锁)2种使用方式

一种是自动管理,一种是手动管理

1: 方式一

lock = threading.Lock()

使用 with lock

with内部实现了enter()和exit()执行语句之前调用enter方法,退出的时候调用exit

2. 方式二

lock = threading.Lock()

lock.acquire() #锁定

lock.release() #释放锁

死锁

定义:是指一个资源多次调用,而多次调用对方都未能释放该资源就会造成一种互相等待的现象,若无外力作用,它们都将无法推进下去,此时称系统处于死锁状态或者系统产生了死锁。

若存在两个线程:线程A 与线程B

若线程A与线程B都 需要资源1与资源2才能执行

现在线程A拿到了资源1,线程B拿到了资源2,此时就构成了死锁。

若要解决死锁的问题,则此时我们需要使用递归锁

递归锁

在Python中为了支持在同一线程中多次请求同一资源,python提供了可重入锁RLock。

这个RLock内部维护着一个Lock和一个counter计数变量,counter记录了acquire的次数,从而使得资源可以被多次require。

直到一个线程所有的acquire都被release,其他的线程才能获得资源。上面的例子如果使用RLock代替Lock,则不会发生死锁。

信号量

控制进程/线程的并发量
semaphore是一个内置的计数器,限制同一时间执行的线程的个数

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: