当前位置: 首页 > news >正文

python 笔记之线程同步和死锁

同步:

共享数据:
如果多个线程共同对某个数据修改,则可能出现不可预测的结果,为了保证数据的正确性,需要对多个数据进行同步
同步:一个一个的完成,一个做完另一个才能进来
效率会降低
使用Thread对象的Lock和RLock可以实现简单的线程同步,这两个对象都有acquire方法和release方法
对于那些需要每次只允许一个线程操作的数据,可以将其操作放到acquire和release方法之间多线程的优势在于可以同时运行多个任务,但是当线程需要共享数据时,可能存在数据不同步的问题。为了避免这种情况,
引入了锁的概念
lock=threading.Lock()
lock.acquire()请求得到锁
lock.release()释放锁
只要不释放其它的线程都无法进入运行状态
import threading
import random
import timelock=threading.Lock()
list1=[0]*10def task1():#获取线程锁,如果已经上锁了,则等待锁的释放lock.acquire() #阻塞for i in range(len(list1)):list1[i]=1time.sleep(1)lock.release()def task2():lock.acquire()for i in range(len(list1)):print('---->',list1[i])time.sleep(1)lock.release()if __name__=='__main__':t1=threading.Thread(target=task1,name='task1')t2=threading.Thread(target=task2,name='task2')t1.start()t2.start()t2.join()t1.join()print(list1)

死锁:

开发过程中使用线程,在线程间共享多个资源的时候
如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁
尽管死锁很少发生,但是一旦发生就会造成应用的停止响应,程序不做任何事情
避免死锁:
解决:
1.重构代码
2.使用timeout
from threading import Thread,Lock
import time
lock1=Lock()
lock2=Lock()
class MyThread(Thread):def run(self):if lock1.acquire():#如果可以获取锁那么返回Trueprint(self.name +"获取了A锁")time.sleep(0.1)if lock2.acquire(timeout=5):print(self.name+"又获得了B锁")lock2.release()lock1.release()class Mythread2(Thread):def run(self):if lock2.acquire():  # 如果可以获取锁那么返回Trueprint(self.name + "获取了B锁")time.sleep(0.1)if lock1.acquire(timeout=5):print(self.name + "又获得了A锁")lock1.release()lock2.release()
if __name__=="__main__":t1=MyThread()t2=Mythread2()t1.start()t2.start()

http://www.lryc.cn/news/497494.html

相关文章:

  • SpringBoot小知识(4):高级配置知识与bean的绑定
  • Python毕业设计选题:基于大数据的淘宝电子产品数据分析的设计与实现-django+spark+spider
  • Lua面向对象实现
  • OpenCV的圆形检测‌HoughCircles
  • iOS视图控制器的生命周期及各阶段的作用
  • 四轮阿克曼(前轮转向、后轮驱动)车子仿真控制
  • Blender均匀放缩模型
  • Python基于 Opencv+wxPython 的人脸识别上课考勤系统,附源码
  • 【AI工具】强大的AI编辑器Cursor详细使用教程
  • DApp开发与APP开发的五大区别
  • 哪款云手机适合多开?常用云手机功能对比
  • Python几种常用数据结构(重制版)
  • C++ 游戏开发:开启游戏世界的编程之旅(2)
  • 用 Python 做数据分析需要掌握哪些基础?
  • UE5 像素流进行内网https证书创建
  • Envoy-istio
  • CTF-PWN: WEB_and_PWN [第一届“吾杯”网络安全技能大赛 Calculator] 赛后学习(不会)
  • 【数据结构与算法】排序算法(上)——插入排序与选择排序
  • Linux操作系统性能优化
  • iOS与Windows间传文件
  • 在数据库设计中同步冗余字段的思考与实践
  • Qt 带数据库功能的项目部署之后,数据库无法打开问题解决方法
  • 汇编语言学习-二
  • 【嘟嘟早教卡】 小程序源码分享带后台管理
  • JavaEE-经典多线程样例
  • 从 HTML 到 CSS:开启网页样式之旅(五)—— CSS盒子模型
  • 数据分析(一): 掌握STDF 掌握金钥匙-码农切入半导体的捷径
  • HCIA-openGauss_1_4基本功能介绍
  • 医学临床机器学习中算法公平性与偏差控制简析
  • Leetcode打卡:棋盘上有效移动组合的数目