Python学习笔记【week04day4】创建线程的3种方式,多线程,线程冲突,互斥锁,递归锁,信号量
2019-06-29 16:25
661 查看
创建线程的3种方式,多线程,线程冲突,互斥锁,递归锁,信号量
创建线程的3种方式
- 守护线程 _thread
子线程会随着主线程的结束而结束。
2.线程创建的方式二:threading
- 线程创建的方式三: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是一个内置的计数器,限制同一时间执行的线程的个数
相关文章推荐
- 0036 Java学习笔记-多线程-创建线程的三种方式
- Python 学习笔记 - 线程(基本概念和创建)
- Java6学习笔记57——多线程编程——线程的互斥(version 0.2)
- python多线程,event,互斥锁,死锁,递归锁,信号量
- java学习笔记之多线程(1)之创建线程
- 黑马程序员--Java学习笔记之多线程(自定义线程的两种方式对比、线程状态、线程安全)
- Python进阶(3)_进程与线程中的lock(线程中互斥锁、递归锁、信号量、Event对象、队列queue)
- JAVA并发编程学习笔记------线程的三种创建方式
- Java多线程学习笔记1——线程的实现方式以及定时器的使用
- Java学习笔记—多线程(简介、线程创建)
- python学习笔记(4)-进程和线程(二)-多线程
- java 多线程学习笔记3-单例设计 线程间通信 互斥锁
- 线程学习之--2多线程的创建的第一种方式
- Java多线程学习总结--线程概述及创建线程的方式(1)
- Java学习之多线程--创建线程的三种方式
- Java6学习笔记55——多线程编程——线程的创建方法1
- Java多线程基础学习之线程的创建方式总结
- 多线程学习笔记1-概念、创建、互斥锁、线程间通信
- Java多线程与并发学习之(二):创建线程的方式
- 黑马程序员_笔记_多线程(创建线程的第二种方式:实现Runable接口)