python中的 同步与异步 互斥锁 和 死锁
同步与异步:
同步:指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去。
异步:指进程不需要一直等下去,而是继续执行下面的操作,不管其他进程的状态。当有消息返回时系统会通知进程进行处理,这样可以提高执行的效率。
同步是阻塞模式,异步是非阻塞模式。
我的理解:同步是指两件事情有关联,其中一件事情要等待另外一件事情的进行。异步的意思是两件事情毫无关联。
互斥锁:
不加锁:
代码演示:
import threading
from threading import Threadnum = 0def work1(n):global numfor i in range(n):num +=1print("in work1:",num)def work2(n):global numfor i in range(n):num += 1print("in work2:",num)def main():t1 = Thread(target=work1,args=(1000000,))t2 = Thread(target=work2,args=(1000000,))t1.start()t2.start()t2.join()if __name__ == '__main__':main()print("main:",num)
运行结果:
加锁:
代码演示:
import threading
from threading import Threadnum = 0lock = threading.Lock() #创建一个锁def work1(n):global numlock.acquire() #加锁for i in range(n):num +=1lock.release() #解锁print("in work1:",num)def work2(n):global numlock.acquire() #加锁for i in range(n):num += 1lock.release() #解锁print("in work2:",num)def main():t1 = Thread(target=work1,args=(1000000,))t2 = Thread(target=work2,args=(1000000,))t1.start()t2.start()t2.join()if __name__ == '__main__':main()print("main:",num)
运行结果:
锁的好处:确保了某段关键代码只能由一个线程从头到尾完整地执行。
锁的坏处:阻止了多线程并发执行,包含锁的某段代码实际上只能以单线程模式执行,效率就大大地下降了由于可以存在多个锁,不同的线程持有不同的锁,并试图获取对方持有的锁时,可能会造成死锁。
死锁:
死锁就是一直等待对方释放锁的情景
死锁的结果会造成程序的停止响应, 不能再处理其他的任务了
死锁示例
代码演示:
from threading import Lock
from threading import Threadlock1 = Lock()
lock2 = Lock()def work1(num):lock1.acquire() #lock1上锁print("in work1")lock2.acquire() #lock2上锁print("work1----")lock2.release() #lock2解锁lock1.release() #lock1解锁def work2(num):lock2.acquire() #lock2加锁print("in work2")lock1.acquire() #lock2加锁print("work2-----")lock1.release() #lock1解锁lock2.release() #lock2解锁if __name__ == '__main__':t1 = Thread(target=work1,args=(1000000,))t2 = Thread(target=work2,args=(1000000,))t1.start()t2.start()
运行结果:
避免死锁
代码演示:
from threading import Lock
from threading import Thread
import timelock1 = Lock()
lock2 = Lock()def work1(num):lock1.acquire() #lock1上锁time.sleep(1)print("in work1")lock2.acquire() #lock2上锁print("work1----")lock2.release() #lock2解锁lock1.release() #lock1解锁def work2(num):lock2.acquire() #lock2加锁print("in work2")lock1.acquire() #lock2加锁print("work2-----")lock1.release() #lock1解锁lock2.release() #lock2解锁if __name__ == '__main__':t1 = Thread(target=work1,args=(1000000,))t2 = Thread(target=work2,args=(1000000,))t1.start()t2.start()
运行结果:
python中的 同步与异步 互斥锁 和 死锁相关推荐
- python中的非阻塞使用互斥锁
锁定方法acquire可以有一个blocking参数. 如果设定blocking为True,则当前线程会堵塞,直到获取到这个锁为止(如果没有指定,那么默认为True) 如果设定blocking为Fal ...
- 操作系统中的同步和异步
操作系统中同步.异步性概念 首先我们从操作系统的发展中学习什么是异步性.在操作系统发展的初期阶段,CPU处理的是作业,而且是单道批处理.什么意思呢?就是一个作业从提交到结束,程序员都不能干预,此时整台 ...
- 深入理解Python中的GIL(全局解释器锁)
前言:本博文主要讲解Python中的GIL(全局解释器锁),本人经过查阅多个资料,摒弃一些较官方的描述,用自己的语言整理并加以补充,如果有描述有误的地方,还望读者在评论区指出,谢谢! 文章目录 一.G ...
- c/c++:线程同步(互斥锁、死锁、读写锁、条件变量、生产者和消费者模型、信号量)
目录 1. 概念 2. 互斥锁 3. 死锁 4. 读写锁 5. 条件变量 5.1 生产者和消费者模型 6. 信号量 1. 概念 线程同步: > 当有一个线程在对内存进行操作时,其他线程都不可以对 ...
- 深入理解Python中的GIL(全局解释器锁)。
Python是门古老的语言,要想了解这门语言的多线程和多进程以及协程,以及明白什么时候应该用多线程,什么时候应该使用多进程或协程,我们不得不谈到的一个东西是Python中的GIL(全局解释器锁).这篇 ...
- Python 多线程总结(2)— 线程锁、线程池、线程数量、互斥锁、死锁、线程同步
主要介绍使用 threading 模块创建线程的 3 种方式,分别为: 创建 Thread 实例函数 创建 Thread 实例可调用的类对象 使用 Thread 派生子类的方式 多线程是提高效率的一种 ...
- 同步、互斥锁、死锁、异步
同步的概念 1. 多线程开发可能遇到的问题 假设两个线程t1和t2都要对num=0进行增1运算,t1和t2都各对num修改10次,num的最终的结果应该为20. 但是由于是多线程访问,有可能出现下面情 ...
- Linux内核中的同步原语:自旋锁,信号量,互斥锁,读写信号量,顺序锁
Linux内核中的同步原语 自旋锁,信号量,互斥锁,读写信号量,顺序锁 rtoax 2021年3月 在英文原文基础上,针对中文译文增加5.10.13内核源码相关内容. 1. Linux 内核中的同步原 ...
- Python多任务(4.多线程--Python中的互斥锁和死锁)
互斥锁 1.互斥锁的概念 2.互斥锁的使用 3.使用互斥锁完成2个线程对同一全局变量各加100万次的操作,而不会出现问题 死锁 死锁的概念 避如何免死锁: 出现死锁的例子 互斥锁 1.互斥锁的概念 互 ...
最新文章
- form表单自动填充
- 忠告14:神原裕司郎:成功源于积累
- 云原生思想 — 云原生的 DevOps
- pbar PermissionError
- Linq to sql查询句法
- 在VS中MFC、ATL与WIN32有什么联系或区别?
- 使用CSS设置JavaFX饼图样式
- xp 与 windows 7 共享收藏夹
- HTML5 从0开始 写连连看 第一集. 背景图 表格绘制
- Java高并发 -- 并发扩展
- 软件工程(英文版 第8版)
- 高中计算机生涯规划,计算机职业生涯规划书
- 四六级阅读难点--选词填空题的一般解题思路
- (可能是)最后一次参加同学婚礼了
- jupyter文件自动保存为html,使用jupyter notebook将文件保存为Markdown,HTML等文件格式...
- 《PUBG》大动作封锁3百万玩家 作弊问题严重
- XML是什么?有什么用?
- 文华编程是c 语言吗,文华财经编程规则
- 一小时让你成为点云建图小将(固定帧数法选取关键帧)
- 中小型企业如何做好网络品牌推广?