【问题标题】:How does python Rlock work and what is the owner of Rlock?python Rlock 是如何工作的,Rlock 的所有者是什么?
【发布时间】:2015-02-24 06:50:40
【问题描述】:

我目前正在练习python多线程模块,我写了一些代码如下,但它没有像我预期的那样工作。

import threading
import thread
import random
import time
lock = threading.RLock()
def func(lock):
    print("In Thread " + threading.currentThread().getName())
    lock.acquire()
    time.sleep(random.random()*10)
    lock.release()
    print("Out Thread " + threading.currentThread().getName())

def start():
    lock.acquire()
    for i in range(5):
        thread.start_new(func, (lock,))
    lock.release()

# for i in range(5):
#     thread.start_new(func, (lock,))
start()

print("test")
time.sleep(1)
lock.acquire()
print("main ends")
lock.release()

在我看来,主线程中是否有time.sleep(1)对新线程的运行影响不大,因为锁是全局的,属于主线程,lock.acquire()操作会总是工作正常,所以主线程不应该等待那些新线程继续。根据thread.start_new()的性质,当主线程结束时,所有新线程也会停止。但是,当我注释掉 time.sleep() 行时,程序按我的预期运行,但是当我添加这行时,主线程总是等待新线程完成。

这让我很困惑,希望有人向我解释 Rlock() 的功能以及当我在主线程中创建它同时将它传递给子新线程并调用 lock 时它属于哪个线程.acquire()?

【问题讨论】:

    标签: python multithreading


    【解决方案1】:

    锁属于最后一次成功执行.acquire()的线程,直到它成为.release()d。

    RLock,可重入锁的缩写,是一种可以被最初获取它的线程多次获取的锁;锁一直被线程锁定并持有,直到每次获取被释放。

    这里的重入意味着执行进入了由锁保护的一段代码,而锁已经被持有。您的代码没有演示需要重入锁的情况,但假设您有函数:

    def guarded_op():
        with lock:
            print("Now doing 1 op")
            another_op()
    
    def another_op():
        with lock:
            print("Now did the another op")
    

    非重入锁在那里不起作用,因为“锁已被锁定”在受保护的操作中; another_op 中的锁定将失败;但是RLock 工作得很好。

    顺便说一句,您应该始终尽可能使用带锁的with 语句,以确保它们有序释放。

    【讨论】:

      猜你喜欢
      • 2014-05-18
      • 1970-01-01
      • 1970-01-01
      • 2016-06-10
      • 1970-01-01
      • 2014-01-02
      • 2016-10-07
      • 1970-01-01
      • 2015-06-18
      相关资源
      最近更新 更多