python 变量锁_python字符串前面加b

python 变量锁_python字符串前面加b一、全局解释器锁(GIL)1、什么是全局解释器锁在同一个进程中只要有一个线程获取了全局解释器(cpu)的使用权限,那么其他的线程就必须等待该线程的全局解释器(cpu)使用权消失后才能使用全局解释器(cpu),即时多个线程直接不会相互影响在同一个进程下也只有一个线程使用cpu,这样的机制称为全局解释器锁(GIL)。2、全局解释器锁的好处1、避免了大量的加锁解锁的好处2、使数据更加安全,解决多线程间的…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

一、全局解释器锁(GIL)

1、什么是全局解释器锁

在同一个进程中只要有一个线程获取了全局解释器(cpu)的使用权限,那么其他的线程就必须等待该线程的全局解释器(cpu)使用权消失后才能使用全局解释器(cpu),即时多个线程直接不会相互影响在同一个进程下也只有一个线程使用cpu,这样的机制称为全局解释器锁(GIL)。

2、全局解释器锁的好处

1、避免了大量的加锁解锁的好处

2、使数据更加安全,解决多线程间的数据完整性和状态同步

3、全局解释器的缺点

多核处理器退化成单核处理器,只能并发不能并行。

同一时刻的某个进程下的某个线程只能被一个cpu所处理,所以在GIL锁下的线程只能被并发,不能被并行。

实例:

importtimeimportthreadingdefsub():globalnum

num-= 1time.sleep(1)

num= 100 #定义一个全局变量

l = [] #定义一个空列表,用来存放所有的列表

for i in range(100): #for循环100次

t = threading.Thread(target=sub) #每次循环开启一个线程

t.start() #开启线程

l.append(t) #将线程加入列表l

for i inl:

i.join()#这里加上join保证所有的线程结束后才运行下面的代码

print(num)#输出结果为0

二、同步锁

1、什么是同步锁?

同一时刻的一个进程下的一个线程只能使用一个cpu,要确保这个线程下的程序在一段时间内被cpu执,那么就要用到同步锁。

2、为什么用同步锁?

因为有可能当一个线程在使用cpu时,该线程下的程序可能会遇到io操作,那么cpu就会切到别的线程上去,这样就有可能会影响到该程  序结果的完整性。

3、怎么使用同步锁?

只需要在对公共数据的操作前后加上上锁和释放锁的操作即可。

4、实例:

importtimeimportthreading

R=threading.Lock()defsub():globalnum

R.acquire()#加锁,保证同一时刻只有一个线程可以修改数据

num -= 1R.release()#修改完成就可以解锁

time.sleep(1)

num= 100 #定义一个全局变量

l = [] #定义一个空列表,用来存放所有的列表

for i in range(100): #for循环100次

t = threading.Thread(target=sub) #每次循环开启一个线程

t.start() #开启线程

l.append(t) #将线程加入列表l

for i inl:

i.join()#这里加上join保证所有的线程结束后才运行下面的代码

print(num)#输出结果为0

5、扩展知识

1、GIL的作用:多线程情况下必须存在资源的竞争,GIL是为了保证在解释器级别的线程唯一使用共享资源(cpu)。

2、同步锁的作用:为了保证解释器级别下的自己编写的程序唯一使用共享资源产生了同步锁。

三、递归锁和死锁

1、什么是死锁?

指两个或两个以上的线程或进程在执行程序的过程中,因争夺资源而相互等待的一个现象

importtimeimportthreading

A=threading.Lock()

B=threading.Lock()importthreadingclassobj(threading.Thread):def __init__(self):

super().__init__()defrun(self):

self.a()#如果两个锁同时被多个线程运行,就会出现死锁现象

self.b()defa(self):

A.acquire()print(‘123’)

B.acquire()print(456)

time.sleep(1)

B.release()print(‘qweqwe’)

A.release()defb(self):

B.acquire()print(‘asdfaaa’)

A.acquire()print(‘(⊙o⊙)哦(⊙v⊙)嗯’)

A.release()

B.release()for i in range(2): #循环两次,运行四个线程,第一个线程成功处理完数据,第二个和第三个就会出现死锁

t =obj()

t.start()

程序会出现阻塞现象

2、什么是递归锁?

在Python中为了支持同一个线程中多次请求同一资源,Python提供了可重入锁。这个RLock内部维护着一个Lock和一个counter

变量,counter记录了acquire的次数,从而使得资源可以被多次require。直到一个线程所有的acquire都被release,其他的线程才能获

得资源。

importtimeimportthreading

A= threading.RLock() #这里设置锁为递归锁

importthreadingclassobj(threading.Thread):def __init__(self):

super().__init__()defrun(self):

self.a()

self.b()def a(self): #递归锁,就是将多个锁的钥匙放到一起,要拿就全拿,要么一个都拿不到

#以实现锁

A.acquire()print(‘123’)print(456)

time.sleep(1)print(‘qweqwe’)

A.release()defb(self):

A.acquire()print(‘asdfaaa’)print(‘(⊙o⊙)哦(⊙v⊙)嗯’)

A.release()for i in range(2):

t=obj()

t.start()

四、信号量(semaphore)

1、什么是信号量?

同进程的一样,semaphore管理一个内置的计数器,每当调用acquire()时内置函数-1,每当调用release()时内置函数+1。

计数器不能为0,当计数器为0时acquire()将阻塞线程,直到其他线程调用release()。

importthreadingimporttime

mysf= threading.Semaphore(5) #创建信号量对象,(5表示这个锁同时支持的个数)

deffunc():if mysf.acquire(): #因为使用了信号量,下面的输出就会5个5个的同时输出

print(threading.currentThread().getName() + ‘get semaphore’)

time.sleep(1)

mysf.release()for i in range(20):

t= threading.Thread(target=func)

t.start()

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/196509.html原文链接:https://javaforall.net

(0)
上一篇 2025年9月25日 下午4:15
下一篇 2025年9月25日 下午4:43


相关推荐

  • 图像配准简介

    图像配准简介图像配准在目标检测 模型重建 运动估计 特征匹配 肿瘤检测 病变定位 血管造影 地质勘探 航空侦察等领域都有广泛的应用 每一种配准方法通常都针对某个具体问题而设计的 众多方法中 唯一的共性就是每个配准问题最终都要在变换空间中寻找一种最有的变换 这种变换能够使两幅图像之间在某种意义上达到匹配 但对于不同的应用领域 对图像类型的要求不同 就需要具体问题具体分析 有研究者根据待配准图像之间的关系

    2026年3月18日
    2
  • Android手机的像素密度(dpi)计算

    Android手机的像素密度(dpi)计算(1)分辨率。分辨率就是手机屏幕的像素点数,一般描述成屏幕的“宽×高”,安卓手机屏幕常见的分辨率有480×800、720×1280、1080×1920等。720×1280表示此屏幕在宽度方向有720个像素,在高度方向有1280个像素。(2)屏幕大小。屏幕大小是手机对角线的物理尺寸,以英寸(inch)为单位。比如某某手机为“5寸大屏手机”,就是指对角线的尺寸,5寸×2.54厘米/寸=12.7厘米。…

    2022年5月29日
    50
  • Idea生成Javadoc

    Idea生成Javadoc

    2022年3月12日
    38
  • 保姆级教程:让AI操作数据库—Cusor配置Sqlite MCP Server|遇到了一个大坑,全网没人说!!

    保姆级教程:让AI操作数据库—Cusor配置Sqlite MCP Server|遇到了一个大坑,全网没人说!!

    2026年3月16日
    3
  • 【AI基础学习系列】四、Prompt基础知识

    【AI基础学习系列】四、Prompt基础知识

    2026年3月15日
    4
  • linux 系统定时任务 服务 详解

    linux 系统定时任务 服务 详解文章目录 Centos7 定时服务详解介绍 1 定时任务概念 01 定时任务作用 02 定时任务分类 03 定时任务实现方式 2 定时任务实践应用 01 定时任务实验环境 02 定时任务配置方法 2 1 定时任务相关文件 2 2 定时任务编写格式 2 3 编写步骤 2 4 定时任务编写注意事项 规范 总结 Centos7 定时服务详解介绍在企业中 存在很多数据需要备份 那么我们如何让这些数据 每天晚上 23 59 自动备份呢 今天呢 我结合部分实践案列 分享一篇关于定时任务的知识点 Linux 下面有 atd 和 crond

    2026年3月16日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号