2015-02-24 65 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語句儘可能鎖定,以確保它們有序釋放。

相關問題