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)


相关推荐

  • CSS解读之alpha通道与opacity属性的区别

    CSS解读之alpha通道与opacity属性的区别上期在谈到border的用途的时候,在最后列举的两个实例中均用到了一个transparent属性值,从字面意思也知道,这个属性值其实和颜色是并列的,不过它表示的是透明。一般的HTML标签在未指定其背景的时候默认就是透明的。我们发现在上个实例在谷歌浏览器中用调试工具查看其CSS属性的时候,transparent自动变成了如图1-1所示的rgba(0,0,0,0)。这说明两者基本是等价的。

  • tkMapper整合「建议收藏」

    tkMapper整合「建议收藏」目录一.简介二.tkMapper整合2.1基于SpringBoot完成MyBatis的整合2.2整合tkMapper三.tkMapper使用四.TkMapper提供的方法4.1添加4.2更新4.3删除4.4查询4.5连表查询一.简介tkMapper就是一个MyBatis插件,提高开发效率。提供了针对单表的数据库操作方法逆向工程(根据数据表生成实体类、dao接口、映射文件)二.tkMapper整合2.1基于SpringBoot完成MyBatis的整合1.新建SpringBoot项目

  • Windows编程(多线程)

    Windows编程(多线程)线程创建函数CreateThreadCreateThread是一种微软在WindowsAPI中提供了建立新的线程的函数,该函数在主线程的基础上创建一个新线程。线程终

    2021年12月13日
  • 第十五篇 Python之文件处理

    第十五篇 Python之文件处理一文件操作计算机系统分为:计算机硬件,操作系统,应用程序三部分。我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众所周知,应

  • 国产Linux操作系统(深度系统)增加了微软Microsoft Edge浏览器(Linux版本)

    国产Linux操作系统(深度系统)增加了微软Microsoft Edge浏览器(Linux版本)深度商店应用更新记录汇总(2021-11)新增应用序号 状态 应用分类 应用名称 应用类型 1 上架 网络应用 迪普SSLVPN Linux 2 上架 影像编辑 浩辰CAD2022 Linux 3 上架 影像编辑 中望建筑CAD设计软件(ForLinux)V2022 Linux 4 上架 效率办公 腾讯文档 Linux 5 上架 系统工具

  • JS刷新当前页面的五种方式

    JS刷新当前页面的五种方式https://www.jb51.net/article/44764.htm

发表回复

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

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