欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python多線程編程(六):可重入鎖RLock

 更新時間:2015年04月05日 11:39:52   投稿:junjie  
這篇文章主要介紹了Python多線程編程(六):可重入鎖RLock,本文直接給出使用實例,然后講解如何使用RLock避免死鎖,需要的朋友可以參考下

考慮這種情況:如果一個線程遇到鎖嵌套的情況該怎么辦,這個嵌套是指當我一個線程在獲取臨界資源時,又需要再次獲取。

根據(jù)這種情況,代碼如下:

復(fù)制代碼 代碼如下:

'''
Created on 2012-9-8
 
@author: walfred
@module: thread.ThreadTest6
''' 
 
import threading 
import time 
 
counter = 0 
mutex = threading.Lock() 
 
class MyThread(threading.Thread): 
    def __init__(self): 
        threading.Thread.__init__(self) 
 
    def run(self): 
        global counter, mutex 
        time.sleep(1); 
        if mutex.acquire(): 
            counter += 1 
            print "I am %s, set counter:%s" % (self.name, counter) 
            if mutex.acquire(): 
                counter += 1 
                print "I am %s, set counter:%s" % (self.name, counter) 
                mutex.release() 
            mutex.release() 
 
if __name__ == "__main__": 
    for i in range(0, 200): 
        my_thread = MyThread() 
        my_thread.start()

這種情況的代碼運行情況如下:

復(fù)制代碼 代碼如下:

I am Thread-1, set counter:1

之后就直接掛起了,這種情況形成了最簡單的死鎖。

那有沒有一種情況可以在某一個線程使用互斥鎖訪問某一個競爭資源時,可以再次獲取呢?在Python中為了支持在同一線程中多次請求同一資源,python提供了“可重入鎖”:threading.RLock。這個RLock內(nèi)部維護著一個Lock和一個counter變量,counter記錄了acquire的次數(shù),從而使得資源可以被多次require。直到一個線程所有的acquire都被release,其他的線程才能獲得資源。上面的例子如果使用RLock代替Lock,則不會發(fā)生死鎖:

代碼只需將上述的:

復(fù)制代碼 代碼如下:

mutex = threading.Lock()

替換成:
復(fù)制代碼 代碼如下:

mutex = threading.RLock()

即可。

相關(guān)文章

  • python解決循環(huán)依賴的問題分析

    python解決循環(huán)依賴的問題分析

    在使用python開發(fā)過程中在引入其他模塊時可能都經(jīng)歷過一個異常就是循環(huán)引用most likely due to a circular import,它的意思就是A引用了B,反過來B又引用了A,導(dǎo)致出現(xiàn)了循環(huán)引用異常,下面來介紹如何避免循環(huán)引用異常,感興趣的朋友跟隨小編一起看看吧
    2022-12-12
  • python分析作業(yè)提交情況

    python分析作業(yè)提交情況

    這篇文章主要為大家詳細介紹了python分析作業(yè)提交情況,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • Django框架模板用法詳解

    Django框架模板用法詳解

    本文詳細講解了Django框架中模板的用法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • PyQt5+Caffe+Opencv搭建人臉識別登錄界面

    PyQt5+Caffe+Opencv搭建人臉識別登錄界面

    這篇文章主要為大家詳細介紹了PyQt5+Caffe+Opencv搭建人臉識別登錄界面,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • Python 實現(xiàn)輸入任意多個數(shù),并計算其平均值的例子

    Python 實現(xiàn)輸入任意多個數(shù),并計算其平均值的例子

    今天小編就為大家分享一篇Python 實現(xiàn)輸入任意多個數(shù),并計算其平均值的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • python 安全地刪除列表元素的方法

    python 安全地刪除列表元素的方法

    這篇文章主要介紹了python 安全地刪除列表元素的方法,分享的方法有 創(chuàng)建新列表,過濾元素和列表副本上迭代,下面相關(guān)內(nèi)容需要的小伙伴可以參考一下
    2022-03-03
  • Python re模塊介紹

    Python re模塊介紹

    這篇文章主要介紹了Python re模塊介紹,需要的朋友可以參考下
    2014-11-11
  • 詳解python中的defaultdict?默認值

    詳解python中的defaultdict?默認值

    這篇文章主要介紹了defaultdict?默認值,defaultdict是python內(nèi)建dict類的一個字類,功能與dict相同,但它帶有一個默認的值,若key值不存在時返回一個默認的值,本文通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2023-04-04
  • Django Rest framework解析器和渲染器詳解

    Django Rest framework解析器和渲染器詳解

    這篇文章主要介紹了Django Rest framework解析器和渲染器詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-07-07
  • python判斷兩個序列的成員是否一樣的實例代碼

    python判斷兩個序列的成員是否一樣的實例代碼

    在本篇文章里小編給大家整理了關(guān)于python判斷兩個序列的成員是否一樣的實例代碼,需要的朋友們參考下。
    2020-03-03

最新評論