同步与异步:

同步:指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去。

异步:指进程不需要一直等下去,而是继续执行下面的操作,不管其他进程的状态。当有消息返回时系统会通知进程进行处理,这样可以提高执行的效率。

同步是阻塞模式,异步是非阻塞模式。

我的理解:同步是指两件事情有关联,其中一件事情要等待另外一件事情的进行。异步的意思是两件事情毫无关联。

互斥锁:


不加锁:
代码演示:

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中的 同步与异步 互斥锁 和 死锁相关推荐

  1. python中的非阻塞使用互斥锁

    锁定方法acquire可以有一个blocking参数. 如果设定blocking为True,则当前线程会堵塞,直到获取到这个锁为止(如果没有指定,那么默认为True) 如果设定blocking为Fal ...

  2. 操作系统中的同步和异步

    操作系统中同步.异步性概念 首先我们从操作系统的发展中学习什么是异步性.在操作系统发展的初期阶段,CPU处理的是作业,而且是单道批处理.什么意思呢?就是一个作业从提交到结束,程序员都不能干预,此时整台 ...

  3. 深入理解Python中的GIL(全局解释器锁)

    前言:本博文主要讲解Python中的GIL(全局解释器锁),本人经过查阅多个资料,摒弃一些较官方的描述,用自己的语言整理并加以补充,如果有描述有误的地方,还望读者在评论区指出,谢谢! 文章目录 一.G ...

  4. c/c++:线程同步(互斥锁、死锁、读写锁、条件变量、生产者和消费者模型、信号量)

    目录 1. 概念 2. 互斥锁 3. 死锁 4. 读写锁 5. 条件变量 5.1 生产者和消费者模型 6. 信号量 1. 概念 线程同步: > 当有一个线程在对内存进行操作时,其他线程都不可以对 ...

  5. 深入理解Python中的GIL(全局解释器锁)。

    Python是门古老的语言,要想了解这门语言的多线程和多进程以及协程,以及明白什么时候应该用多线程,什么时候应该使用多进程或协程,我们不得不谈到的一个东西是Python中的GIL(全局解释器锁).这篇 ...

  6. Python 多线程总结(2)— 线程锁、线程池、线程数量、互斥锁、死锁、线程同步

    主要介绍使用 threading 模块创建线程的 3 种方式,分别为: 创建 Thread 实例函数 创建 Thread 实例可调用的类对象 使用 Thread 派生子类的方式 多线程是提高效率的一种 ...

  7. 同步、互斥锁、死锁、异步

    同步的概念 1. 多线程开发可能遇到的问题 假设两个线程t1和t2都要对num=0进行增1运算,t1和t2都各对num修改10次,num的最终的结果应该为20. 但是由于是多线程访问,有可能出现下面情 ...

  8. Linux内核中的同步原语:自旋锁,信号量,互斥锁,读写信号量,顺序锁

    Linux内核中的同步原语 自旋锁,信号量,互斥锁,读写信号量,顺序锁 rtoax 2021年3月 在英文原文基础上,针对中文译文增加5.10.13内核源码相关内容. 1. Linux 内核中的同步原 ...

  9. Python多任务(4.多线程--Python中的互斥锁和死锁)

    互斥锁 1.互斥锁的概念 2.互斥锁的使用 3.使用互斥锁完成2个线程对同一全局变量各加100万次的操作,而不会出现问题 死锁 死锁的概念 避如何免死锁: 出现死锁的例子 互斥锁 1.互斥锁的概念 互 ...

最新文章

  1. form表单自动填充
  2. 忠告14:神原裕司郎:成功源于积累
  3. 云原生思想 — 云原生的 DevOps
  4. pbar PermissionError
  5. Linq to sql查询句法
  6. 在VS中MFC、ATL与WIN32有什么联系或区别?
  7. 使用CSS设置JavaFX饼图样式
  8. xp 与 windows 7 共享收藏夹
  9. HTML5 从0开始 写连连看 第一集. 背景图 表格绘制
  10. Java高并发 -- 并发扩展
  11. 软件工程(英文版 第8版)
  12. 高中计算机生涯规划,计算机职业生涯规划书
  13. 四六级阅读难点--选词填空题的一般解题思路
  14. (可能是)最后一次参加同学婚礼了
  15. jupyter文件自动保存为html,使用jupyter notebook将文件保存为Markdown,HTML等文件格式...
  16. 《PUBG》大动作封锁3百万玩家 作弊问题严重
  17. XML是什么?有什么用?
  18. 文华编程是c 语言吗,文华财经编程规则
  19. 一小时让你成为点云建图小将(固定帧数法选取关键帧)
  20. 中小型企业如何做好网络品牌推广?

热门文章

  1. 解密Go协程的栈内存管理
  2. 用etcd实现服务注册和发现
  3. Redis:哨兵模式(针对某一模块,数据量有限)
  4. 深入理解Redis分布式锁
  5. 依赖注入[2]: 基于IoC的设计模式
  6. Python XML解析
  7. Ios开发之定位CLLocationManager
  8. (一)加法计算器(第一个iOS APP)
  9. VRRP和HSRP在企业网中的应用
  10. SQL Server 2005中NTEXT与NVARCHAR(MAX)