Python的锁

1互斥锁 2 3# 锁通常被用来实现对共享资源的同步访问。为每一个共享资源创建一个Lock对象,l = Lock()#创建一个锁,初始状态是未锁定# 当你需要访问该资源时,调用l.acquire方法来获取锁对象# (如果其它线程已经获得了该锁,则当前线程需等待其被释放)# ,待资源访问完后,再调用l.release方法释放锁

1from threading import Thread,Lock,RLock 2import time 3def gg(A,B): 4 A.acquire() 5 time.sleep(0.5) 6 print('hah拿到锁') 7 B.acquire() 8 print('hah拿到锁') 9 A.release() 10 B.release() 11def gg2(A,B): 12 B.acquire() 13 print('hah1拿到锁') 14 A.acquire() 15 print('hah1拿到锁') 16 A.release() 17 B.release() 18 19 20if __name__ == '__main__': 21 # A = Lock() 22 # B = Lock() 23 # 解决死锁 24 A = B = RLock() #每个递归锁都有自己的递归锁的计数器, 25 t1 = Thread(target=gg,args=(A,B)) 26 t2 = Thread(target=gg2,args=(A,B)) 27 t1.start() 28 t2.start() 29 30同一个递归锁,每碰到一个acquire 计数器加1 31 每碰道一个release计算器减1

死锁现象与解决

 

1gil 锁 2# 在Cpython中,gil锁相当于锁定python解释器的锁,在同一个进程下可以开启多个线程,但是同一时刻只能有一个线程执行,无法利用多核技术 3#优势 4# 1. GIL本质就是一把互斥锁,所有互斥锁的本质都一样,都是将并发运行变成串行,以此来控制同一时间内共享数据只能被一个任务所修改, 5# 进而保证数据安全 6# 2.每运行一个Py文件文件都会对应产生一个独立的进程,在该进程内不仅有这个程序的主线程还开启了其他的线程 7# 还有解释器开启的垃圾回收等解释器级别的线程 8# GIL保护的是解释器级的数据,保护用户自己的数据则需要自己加锁处理 9# 进程可以利用多核,但是开销大,而python的多线程开销小,但却无法利用多核优势 10 11python解释器运行原理
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

Java并发源码之ReentrantLock

ReentrantLock介绍ReentrantLock是一个可重入的互斥锁,与使用synchronized方法和语句访问的隐式监视锁具有相同的基本行为和语义,但具有扩展功能。ReentrantLock属于最后一个成功加锁并且还没有释放锁的线程。当一个线程请求lock时,如果锁不属于任何线程,将立马得到这个锁;如果锁已经被