我目前正在练习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()的功能,以及当我在主线程中创建Rlock()并将其传递给子新线程并调用lock.acquire()时,它属于哪个线程。 )?

最佳答案

锁属于上一次成功对其进行.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")

非重入锁不能在那里工作,因为在 protected 操作中“锁已被锁定”。锁定将在another_op中失败;但是RLock可以正常工作。

顺便说一句,您应该始终将with语句与锁一起使用,以确保其有序释放。

10-07 12:01