Python中的锁对象——可重入锁

如果您尝试运行下面提供的代码,锁对象将在第一次调用acquire()方法时获得锁,但第二次不会。

成都创新互联是一家集网站建设,玉溪企业网站建设,玉溪品牌网站建设,网站定制,玉溪网站建设报价,网络营销,网络优化,玉溪网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。

为什么会这样?因为正常的锁对象一旦被获取就不能被重新获取,即使相同的线程试图这样做。

但是为什么会有人尝试两次调用acquire()方法呢?让我们举一个简单的例子来演示这个简单的锁定问题:

lock = threading.Lock()

def get_first_line():
    lock.acquire()
    try:
        # read some file and get the first line
    finally:
        lock.release()
    return data

def get_second_line():
    lock.acquire()
    try:
        # read the same file and get the second line
    finally:
        lock.release()
    return data

在上面的代码中,我们有两个不同的函数从共享资源中读取不同部分的数据。我们使用了锁定机制来防止任何其他线程在我们的线程读取文件时修改文件的数据。

现在考虑您想要逐个调用这两个函数,您将这样做:

first = get_first_line()
second = get_second_line()

return first, second 

但是这个调用仍然不是线程安全的,因为当您从共享资源中读取数据时,在两个函数调用之间可以有任何其他线程可以修改共享资源的内容。

为了避免这种情况,我们可以获取一个锁,然后调用这两个函数:

lock.acquire()

try:
    first = get_first_line()
    second = get_second_line()
finally:
    lock.release()
return first, second 

但是,这段代码不会起作用,因为我们将在同一线程内的锁对象上调用acquire(),试图在调用函数之前已经获取的函数内再次获取锁。

因此,在这种情况下,不能使用基本的锁对象。对于这样的情况我们有RLock类。


对象:Python 多线程

RLock 代表可重入锁。同一个线程可以多次获取可重入锁。

RLock 对象也有两个可以调用的方法,它们是:

  1. acquire()方法
  2. release()方法

这里有一个简单的例子来演示RLock对象的工作:

如果我们使用RLock对象,那么简单的锁定问题示例中的代码也将毫无问题地工作:

lock = threading.RLock()

lock.acquire()

try:
    first = get_first_line()
    second = get_second_line()
finally:
    lock.release()
return first, second 

上面的代码可以正常工作。



文章标题:Python中的锁对象——可重入锁
本文路径:http://www.shufengxianlan.com/qtweb/news36/394586.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联