目录

  • 一、锁
  • 二、解决死锁问题---递归锁
    • 2.1 递归锁
  • 三、信号量

一、锁

线程中的锁机制和进程中一样。都是通过锁来控制资源访问虽然,线程中的资源是共享的,但也可以通过锁来进行控制。达到线程同步的目的。虽然牺牲了效率但是保证了安全。

x = 0
mutex = Lock()
def task():global xmutex.acquire() # 上锁for i in range(200000):x = x +1mutex.release() # 解锁if __name__ == '__main__':th_list = []for i in range(10):t1 =  Thread(target=task())t1.start()th_list.append(t1)for i in th_list:i.join()print(x)

二、解决死锁问题---递归锁

死锁问题:死锁就是A等B,B等A,互相都在等锁的开启。因此会造成阻塞。

from threading import Thread,Lock,RLock
# 普通的锁,会出现死锁问题
mutex1 = Lock()
mutex2 = Lock()import time
class MyThread(Thread):def run(self):self.task1()self.task2()def task1(self):mutex1.acquire()print(f'{self.name} 抢到了 锁1 ')mutex2.acquire()print(f'{self.name} 抢到了 锁2 ')mutex2.release()print(f'{self.name} 释放了 锁2 ')mutex1.release()print(f'{self.name} 释放了 锁1 ')def task2(self):mutex2.acquire()print(f'{self.name} 抢到了 锁2 ')time.sleep(1)       # 出现死锁问题。因为没有执行完,但是mutex1在别的线程中被上锁。mutex2在当前线程中被上锁。mutex1.acquire()print(f'{self.name} 抢到了 锁1 ')mutex1.release()print(f'{self.name} 释放了 锁1 ')mutex2.release()print(f'{self.name} 释放了 锁2 ')for i in range(3):t = MyThread()t.start()

2.1 递归锁

递归锁 同一个线程内可以被多次acquire,但acquire了几次就要release几次内部相当于维护了一个计数器

# 递归锁,可以多次,多次解锁
mutex1 = RLock()
mutex2 = mutex1import time
class MyThread(Thread):def run(self):self.task1()self.task2()def task1(self):mutex1.acquire()print(f'{self.name} 抢到了 锁1 ')mutex2.acquire()print(f'{self.name} 抢到了 锁2 ')mutex2.release()print(f'{self.name} 释放了 锁2 ')mutex1.release()print(f'{self.name} 释放了 锁1 ')def task2(self):mutex2.acquire()print(f'{self.name} 抢到了 锁2 ')time.sleep(1)       # 出现死锁问题。因为没有执行完,但是mutex1在别的线程中被上锁。mutex2在当前线程中被上锁。mutex1.acquire()print(f'{self.name} 抢到了 锁1 ')mutex1.release()print(f'{self.name} 释放了 锁1 ')mutex2.release()print(f'{self.name} 释放了 锁2 ')for i in range(3):t = MyThread()t.start()

三、信号量

信号量就是加了计数器的锁

代表了同时可以有 多少人 在使用锁

from threading import Thread,currentThread, Semaphore
import time
def task():sem.acquire()print(f'{currentThread().name} 在执行')time.sleep(3)sem.release()sem =  Semaphore(5)
for i in range(15):t = Thread(target=task)t.start()

转载于:https://www.cnblogs.com/XuChengNotes/p/11552844.html

119 Python程序中的线程操作-线程同步相关推荐

  1. 在python程序中的进程操作

    ********在python程序中的进程操作********之前我们已经了解了很多进程相关的理论知识,了解进程是什么应该不再困难了,刚刚我们已经了解了, 运行中的程序就是一个进程.所有的进程都是通过 ...

  2. python在中小学教学中的应用-在python程序中的进程操作

    ********在python程序中的进程操作********之前我们已经了解了很多进程相关的理论知识,了解进程是什么应该不再困难了,刚刚我们已经了解了, 运行中的程序就是一个进程.所有的进程都是通过 ...

  3. python启动多个进程_Python程序中的进程操作--—--开启多进程

    Python程序中的进程操作-----开启多进程 之前我们已经了解了很多进程相关的理论知识,了解进程是什么应该不再困难了,刚刚我们已经了解了,运行中的程序就是一个进程.所有的进程都是通过它的父进程来创 ...

  4. python中flush怎么用,在Python程序中操作文件之flush()方法的使用教程

    在Python程序中操作文件之flush()方法的使用教程 flush()方法刷新内部缓冲区,像标准输入输出的fflush.这类似文件的对象,无操作. Python关闭时自动刷新文件.但是可能要关闭任 ...

  5. 微课系列(7):Python程序中sys.argv的用法

    技术要点: 1)Python程序中如果使用到了sys.argv,这样的程序一般需要在命令提示符环境中运行,而不是在Python开发环境直接中运行. 2)sys.argv是个包含若干字符串的列表,其中s ...

  6. 如何在Python程序中运行Unix命令

    Unix是由Ken Thompson和Dennis Ritchie在1969年左右在AT&T贝尔实验室开发的操作系统. 我们可以使用许多有趣的Unix命令来执行不同的任务. 问题是,我们可以直 ...

  7. 关于python缩进的描述中_关于Python程序中与“缩进”有关的说法中,以下选项中正确的是()...

    关于Python程序中与"缩进"有关的说法中,以下选项中正确的是() 答:缩进在程序中长度统一且强制使用 同文学或同音乐主题的民歌,<_______>是其中之一.此曲经 ...

  8. 哪个是python程序中与缩进有关的正确说法_关于Python程序中与“缩进”有关的说法中,以下选项中正确的是()。_学小易找答案...

    [单选题]白内障的主要症状 [多选题]白内障病人手术后护理重点观察是 [单选题]某女,21岁.排球比赛时与队员发生碰撞,后诉鼻梁疼痛来院就诊,检查鼻腔发现鼻中隔有一小血肿.正确处理方法是 [单选题]开 ...

  9. python缩进说法_【多选题】关于Python程序中与“缩进”有关的说法中,以下选项中错误的是()。...

    问题:[多选题]关于Python程序中与"缩进"有关的说法中,以下选项中错误的是(). 更多相关问题 因方某将赵某打伤,方某住所地的市劳动教养委员会对方某作出劳动教养2年的决定,并 ...

  10. Python程序中各函数间调用关系分析与可视化

    中国大学MOOC"Python程序设计基础"免费学习地址 2020年秋季学期Python教材推荐与选用参考 推荐图书: <Python程序设计(第3版)>,(ISBN: ...

最新文章

  1. 李宏毅线性代数11: 正交(Orthogonality)
  2. 用函数计算工龄_还在加班熬夜求年龄,算工龄,学会这招让你分分钟钟搞定这些!...
  3. 沉没成本(要不要买房)
  4. 条件随机场 python_用条件随机场做网络小说命名实体识别
  5. linux串口缓冲区的大小,linux-----------串口设置缓冲器的大小
  6. 自学成才翁_以自学成才的设计师的身份在产品表旁导航。
  7. linux取消设置环境变量,linux设置环境变量
  8. oracle如何读取到从n行到m行的数据_关系型数据库进阶之查询优化
  9. delphi三方控件的安装方法
  10. 薅羊毛专业版助手,支持抖音/快手/京东/刷宝等50多个APP自动签到领红包,分享源码互相学习
  11. docker(9):高级网络配置
  12. 科罗拉多大学波尔得分校计算机科学,科罗拉多大学波尔得分校院系设置
  13. 婚恋相亲交友短视频婚姻介绍所中介平台系统app公众号H5搭建源码
  14. mscorsvw.exe是windows的什么进程!!
  15. 第六次网页前端培训(JavaScript)
  16. java 正则替换以 开头_String replaceAll-正则匹配-截取以指定字符开头,以指定字符结尾的字符串...
  17. Java使用Separator替代符号拼接
  18. TokenGazer《一问到底》第53期:研究员 vs Cocos-BCX
  19. 自然语言处理(NLP)之命名实体识别
  20. 网页设计html 模拟试题

热门文章

  1. php扩展zval,PHP扩展开发(7):zval结构
  2. java基础总结01-简介
  3. VMware与宿主机同一网段
  4. ApiDoc 一键生成注释
  5. Python星号表达式
  6. 【VS开发】Windows平台下Makefile学习笔记
  7. jquery实现百度类似搜索提示功能(AJAX应用)
  8. db.serverStatus()
  9. Spring自定义注解(验证身份证+性别+地区)
  10. 简单使用hibernate(idea中使用)