2015-02-24 26 views
1

我目前正在练习python多线程模块,并且我编写了一些如下代码,但它并不像我期望的那样工作。python Rlock如何工作以及Rlock的所有者是什么?

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()?

回答

1

一把锁属于最后做的.acquire()它成功的线程,直到它已经.release() d。

A 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语句尽可能锁定,以确保它们有序释放。

相关问题