Python的锁

Stella981
• 阅读 654
互斥锁

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

Python的锁 Python的锁

from threading import Thread,Lock,RLock
import time
def gg(A,B):
    A.acquire()
    time.sleep(0.5)
    print('hah拿到锁')
    B.acquire()
    print('hah拿到锁')
    A.release()
    B.release()
def gg2(A,B):
    B.acquire()
    print('hah1拿到锁')
    A.acquire()
    print('hah1拿到锁')
    A.release()
    B.release()


if __name__ == '__main__':
    # A = Lock()
    # B = Lock()
    # 解决死锁
    A =  B = RLock()  #每个递归锁都有自己的递归锁的计数器,
    t1 = Thread(target=gg,args=(A,B))
    t2 = Thread(target=gg2,args=(A,B))
    t1.start()
    t2.start()

同一个递归锁,每碰到一个acquire 计数器加1
                    每碰道一个release计算器减1

死锁现象与解决

 Python的锁

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

python解释器运行原理
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
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
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
Java并发包小结
1、Lock  Lock功能对应关键字synchrozied功能,lock和unlock方法用于加锁和释放锁。等待锁的线程加入到等待链表中,同时阻塞线程,锁释放时,从等待链表中取出等待的线程执行,取等待的线程分公平与非公平两种方式,公平方式取第一个等待的线程,非公平方式当前正在获取锁的线程可能立刻执行,而不用加入到等待队列中,排队执行。2、Con
Wesley13 Wesley13
3年前
Java并发源码之ReentrantLock
ReentrantLock介绍ReentrantLock是一个可重入的互斥锁,与使用synchronized方法和语句访问的隐式监视锁具有相同的基本行为和语义,但具有扩展功能。ReentrantLock属于最后一个成功加锁并且还没有释放锁的线程。当一个线程请求lock时,如果锁不属于任何线程,将立马得到这个锁;如果锁已经被
Wesley13 Wesley13
3年前
Java学习笔记7
lock接口实现类ReentrantLock我们可以用lock对象,来对临界资源加锁,只有获得lock对象才能访问临界资源,如果没有获得lock对象,就会进入lock对象的锁池。trylock()方法会返回布尔值,这个方法是用来判断这个锁对象是不是已经被线程获取,如果返回值为true,则会直接获得这个锁对象,如果返回false,线程不会阻塞还会继
Wesley13 Wesley13
3年前
Java多线程锁释放
Java多线程运行环境中,在哪些情况下会使对象锁释放?由于等待一个锁的线程只有在获得这把锁之后,才能恢复运行,所以让持有锁的线程在不再需要锁的时候及时释放锁是很重要的。在以下情况下,持有锁的线程会释放锁:(1)执行完同步代码块,就会释放锁。(synchronized)(2)在执行同步代码块的过程中,遇到异常而导致线程终止,锁也会被释放。(exc
Stella981 Stella981
3年前
Linux 多线程
I.同步机制线程间的同步机制主要包括三个:互斥锁:以排他的方式,防止共享资源被并发访问;互斥锁为二元变量,状态为0开锁、1上锁;开锁必须由上锁的线程执行,不受其它线程干扰.条件变量:
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Wesley13 Wesley13
3年前
Java并发编程总结(一)Syncronized解析
Syncronized解析作用:(1)确保线程互斥的访问同步代码(2)保证共享变量的修改能够及时可见(3)有效解决重排序问题。用法:(1)修饰普通方法(锁是当前实例对象)(2)修饰静态方法(锁是当前对象的Class对象)(3)修饰代码块(锁是Synchonized括号里配置的