文档章节

~~并发编程(十二):死锁和递归锁~~

o
 osc_g8254g7s
发布于 2019/08/18 00:00
字数 572
阅读 5
收藏 0

精选30+云产品,助力企业轻松上云!>>>

<center><h3>进击のpython</h3></center>


并发编程——死锁和递归锁


死锁是一种现象:

两个及以上的进程或者线程在争抢资源的过程中,出现的互相等待的现象

如果没有外部干预,他们就一直僵持,永远在互相等待,就“死”住了

看一下现象:

from threading import Thread, Lock


def func(A, B):
    A.acquire()
    print('A:这是func函数的开始.. ..')
    B.acquire()
    print('B:这是func函数的开始.. ..')
    B.release()
    print('B:这是func函数的结束!')
    A.release()
    print('A:这是func函数的结束!')


def inner(A, B):
    B.acquire()
    print('A:这是inner函数的开始.. ..')
    A.acquire()
    print('B:这是inner函数的开始.. ..')
    A.release()
    print('B:这是inner函数的结束!')
    B.release()
    print('A:这是inner函数的结束!')


def main(A, B):
    func(A, B)
    inner(A, B)


if __name__ == '__main__':
    A = Lock()
    B = Lock()
    for i in range(10):
        t = Thread(target=main, args=(A, B))
        t.start()

执行的时候就会出现阻塞情况(自己执行)

那我也想保护func里面的数据,也想保护inner里面的数据,应该怎么办?


递归锁

为了解决上述问题,递归锁应运而生

为了支持在同一线程中多次请求同一资源,python就提供了重入锁RLock

这个锁就很有意思,他里面除了互斥锁Lock以外,还有一个计数器counter

counter记录了acquire的次数,从而使得资源可以被多次require

直到一个线程所有的acquire都被release,其他的线程才能获得资源

上面的例子如果使用RLock代替Lock,则不会发生死锁

二者的区别是:递归锁可以连续acquire多次,而互斥锁只能acquire一次

from threading import Thread, RLock


def func(A, B):
    A.acquire()
    print('A:这是func函数的开始.. ..')
    B.acquire()
    print('B:这是func函数的开始.. ..')
    B.release()
    print('B:这是func函数的结束!')
    A.release()
    print('A:这是func函数的结束!')


def inner(A, B):
    B.acquire()
    print('B:这是inner函数的开始.. ..')
    A.acquire()
    print('A:这是inner函数的开始.. ..')
    A.release()
    print('A:这是inner函数的结束!')
    B.release()
    print('B:这是inner函数的结束!')


def main(A, B):
    func(A, B)
    inner(A, B)


if __name__ == '__main__':
    B = A = RLock() # 区别在这!
    for i in range(10):
        t = Thread(target=main, args=(A, B))
        t.start()


<center>*****</center> <center>*****</center>

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
多线程

并发编程之多线程(理论) 一 threading模块介绍 multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性,因而不再详细介绍 官网链接:https://docs.python.org/3...

osc_on5pjexo
04/16
2
0
python并发编程之多线程

一 threading模块介绍 multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性,因而不再详细介绍 官网链接:https://docs.python.org/3/library/threading.htm...

osc_45omoec3
2018/01/25
2
0
python开发之路

第一篇:Python基础 Python入门 python 的数据类型 文件操作 第二篇:函数 函数基础 用户注册register()示例 扩展注册功能装饰器举例 函数嵌套调用、名称空间与作用域、函数对象 函数装饰器 ...

osc_x690pobu
2019/08/25
1
0
并发编程之多线程

一、threading模块介绍   multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性,因而不再详细介绍   官网链接:点击进入 二、开启线程的两种方式   mul...

osc_ljezv5mf
2018/05/08
2
0
DAY9-python并发之多线程

一 threading模块介绍 multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性,因而不再详细介绍 官网链接:https://docs.python.org/3/library/threading.htm...

osc_e4gzv47r
2018/02/09
1
0

没有更多内容

加载失败,请刷新页面

加载更多

dict.items()和dict.iteritems()有什么区别?

问题: Are there any applicable differences between dict.items() and dict.iteritems() ? dict.items()和dict.iteritems()之间是否有适用的区别? From the Python docs: 从Python文档中......

法国红酒甜
51分钟前
20
0
R中“ =”和“ <-”赋值运算符有什么区别?

问题: What are the differences between the assignment operators = and <- in R? R中赋值运算符=和<-之间有什么区别? I know that operators are slightly different, as this example ......

fyin1314
今天
20
0
之间的区别 和

问题: I'm learning Spring 3 and I don't seem to grasp the functionality behind <context:annotation-config> and <context:component-scan> . 我正在学习Spring 3,并且似乎不太了解<......

javail
今天
15
0
业内首款,百度工业视觉智能平台全新亮相

本文作者:y****n 业内首款全国产化工业视觉智能平台——百度工业视觉智能平台亮相中国机器视觉展(Vision China),该平台所具有的核心AI能力完全自主可控,在质检、巡检等场景中具有高效、...

百度开发者中心
昨天
7
0
我们如何制作xkcd样式图? - How can we make xkcd style graphs?

问题: Apparently, folk have figured out how to make xkcd style graphs in Mathematica and in LaTeX . 显然,民间已经想出了如何在Mathematica和LaTeX中制作xkcd风格的图形。 Can we d......

富含淀粉
今天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部