我目前正在练习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
语句与锁一起使用,以确保其有序释放。