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()

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • json_decod导致精度丢失问题「建议收藏」

    json_decod导致精度丢失问题「建议收藏」json_decod导致精度丢失问题

  • JS中判断数组中是否包含某个元素indexof兼容性兼容性

    JS中判断数组中是否包含某个元素indexof兼容性兼容性1.前几天写了一个JS游戏,其中,判断数组中是否包含某个元素,开始使用如下方法判断if(appearAnimals.indexOf(randIndex)==-1){}目前主流的浏览器都能正常显示,但是遇到IE9以下版本就不行,通过逐行排查,才发现是indexOf的兼容性问题。IE9以前的版本都不支持此方法,现在写一个兼容的方法如下:if(!Array.indexOf){

    2022年10月19日
  • 十大滤波算法总结[通俗易懂]

    十大滤波算法总结[通俗易懂]由于MPU6050的深入,我也学会了一些滤波算法,自己写了一些算法,收集了一些算法,供大家一起学习分享,我的代码都是经过反复试验,复制到Arduino中就能开跑的成品代码,移植到自己的程序中非常方便。而且都仔细研究了各个算法,把错误都修正了的,所以也算个小原创吧,在别人基础上的原创。1、限幅滤波法(又称程序判断滤波法)2、中位值滤波法3、算术平均滤波法4、递推平均滤波法(又称滑动平

  • TCP端口大全_tcpserver和tcpclient介绍

    TCP端口大全_tcpserver和tcpclient介绍1、登录linux部署服务器,用命令查找配置文件elasticsearch.yml,如图find-nameelasticsearch.yml2、进到elasticsearch.yml文件的目录3、查看tcp,http端口

  • 我的EJB学习历程

    我的EJB学习历程

    2021年12月14日
  • 贴片机保养步骤 保养项目 保养的目的与作用

    贴片机是一种高强度、长时间、超负荷的运转设备,需要定期进行细心的呵护保养,贴片机保养的好,运转稳定,保证日常生产产能,贴片机如衣食父母;贴片机保养不到位或经常不保养,性能再好的机子也会不堪重负出现各类毛病,影响生产产能和产品质量,因此贴片机保养是贴片厂非常重要的一环工作内容事项。(延伸阅读:何为SMT?smt是做什么的,smt贴片是什么意思?)贴片机日保用干净白布清洁机器表面灰尘,包含机身、显示器、键盘、鼠标、开关等;检测气压正常值;检查机器内部各装置是否正常;用吸尘器清洁机器里

发表回复

您的电子邮箱地址不会被公开。

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