python 笔记之线程同步和死锁

同步:

复制代码
共享数据:
如果多个线程共同对某个数据修改,则可能出现不可预测的结果,为了保证数据的正确性,需要对多个数据进行同步
同步:一个一个的完成,一个做完另一个才能进来
效率会降低
使用Thread对象的Lock和RLock可以实现简单的线程同步,这两个对象都有acquire方法和release方法
对于那些需要每次只允许一个线程操作的数据,可以将其操作放到acquire和release方法之间

多线程的优势在于可以同时运行多个任务,但是当线程需要共享数据时,可能存在数据不同步的问题。为了避免这种情况,
引入了锁的概念
lock=threading.Lock()
lock.acquire()请求得到锁
lock.release()释放锁
只要不释放其它的线程都无法进入运行状态
复制代码
import threading
import random
import time

lock=threading.Lock()
list1=[0]*10

def task1():
    #获取线程锁,如果已经上锁了,则等待锁的释放
    lock.acquire() #阻塞
    for i in range(len(list1)):
        list1[i]=1
        time.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():#如果可以获取锁那么返回True
            print(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():  # 如果可以获取锁那么返回True
            print(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()
相关推荐
无语的小歪歪1 分钟前
ATF 智测 1.0
python·测试工具·集成测试
Rabitebla4 分钟前
【Linux】 权限篇(三):深入理解 umask 位运算与粘滞位的设计思想
java·linux·服务器·c++·笔记·学习
czq_26867194876 分钟前
Python打卡第45天
开发语言·python
java_prinln9 分钟前
9. Agent 的长短期记忆系统怎么做的?记忆是怎么存的?粒度是多少?怎么用的?
数据库·python·agent
FOAF-lambda13 分钟前
Python实战:基于OpenCV与单调栈,精准定位PDF中最大的空白区域
python·opencv·pdf
terry60019 分钟前
企业数据查询接口防爬实战:图形验证码服务端校验接入与限流设计(附Python)
python·信息与通信·图形验证码·反爬虫·人机验证·行为验证码·滑动拼图验证
量化炼金 (CodeAlchemy)20 分钟前
【Python】pandas vs polars 简单性能对比测试
开发语言·python·pandas
学习论之费曼学习法22 分钟前
无人值守AI内容矩阵实战(7):Playwright 发布器避坑——编辑器竞态、索引延迟与风控
python·线性代数·矩阵·编辑器·浏览器自动化·playwright·踩坑记录
实名上网宋凯宣26 分钟前
现代电网可靠性测试系统-VPP工作笔记
笔记·学习
wuyk55527 分钟前
PyQt6-第06讲-主窗口框架
python·pyqt