線程鎖簡述

Lock 互斥鎖

請求鎖 - 進(jìn)入鎖定池 - 獲取鎖 - 鎖定 - 釋放鎖
Lock處于鎖定狀態(tài)時(shí),不被特定的線程擁有阴挣。
acquire([timeout]): 使線程進(jìn)入同步阻塞狀態(tài),嘗試獲得鎖定啰扛。
release(): 釋放鎖扭倾。使用前線程必須已獲得鎖定,否則將拋出異常。

RLock 可重入鎖

可以被同一個(gè)線程請求多次的同步指令
RLock使用了“擁有的線程”和“遞歸等級”的概念,處于鎖定狀態(tài)時(shí),RLock被某個(gè)線程擁有膜蛔。擁有RLock的線程可以再次調(diào)用acquire(),釋放鎖時(shí)需要調(diào)用release()相同次數(shù)处硬。
可以認(rèn)為RLock包含一個(gè)鎖定池和一個(gè)初始值為0的計(jì)數(shù)器,每次成功調(diào)用 acquire()/release(),計(jì)數(shù)器將+1/-1,為0時(shí)鎖處于未鎖定狀態(tài)。

Semaphore 共享對象訪問

管理一個(gè)內(nèi)置的計(jì)數(shù)器 獲取鎖 +1 釋放鎖 -1 當(dāng)計(jì)數(shù)器等于0的時(shí)候 獲取鎖阻塞等待

import time
import threading
semaphore = threading.Semaphore(3)
def func():
    if semaphore.acquire():
        for i in range(3):
              time.sleep(1)
              print (threading.currentThread().getName() + '獲取鎖')
              semaphore.release()
              print (threading.currentThread().getName() + ' 釋放鎖')
for i in range(5):
     t1 = threading.Thread(target=func)
     t1.start()

Event 線程間通信

Event內(nèi)部包含了一個(gè)標(biāo)志位,初始的時(shí)候?yàn)閒alse蛙紫。
可以使用使用set()來將其設(shè)置為true;
或者使用clear()將其從新設(shè)置為false;
可以使用is_set()來檢查標(biāo)志位的狀態(tài);
另一個(gè)最重要的函數(shù)就是wait(timeout=None),用來阻塞當(dāng)前線程,直到event的內(nèi)部標(biāo)志位被設(shè)置為true或者timeout超時(shí)拍屑。如果內(nèi)部標(biāo)志位為true則wait()函數(shù)理解返回。

Condition 線程同步

可以把Condition理解為一把高級的瑣,它提供了比Lock, RLock更高級的功能,允許我們能夠控制復(fù)雜的線程同步問題坑傅。threadiong.Condition在內(nèi)部維護(hù)一個(gè)瑣對象(默認(rèn)是RLock),可以在創(chuàng)建Condigtion對象的時(shí)候把瑣對象作為參數(shù)傳入僵驰。Condition也提供了acquire, release方法,其含義與瑣的acquire, release方法一致,其實(shí)它只是簡單的調(diào)用內(nèi)部瑣對象的對應(yīng)的方法而已。Condition還提供了如下方法(特別要注意:這些方法只有在占用瑣(acquire)之后才能調(diào)用,否則將會(huì)報(bào)RuntimeError異常唁毒。):

Condition.wait([timeout]):
wait方法釋放內(nèi)部所占用的瑣,同時(shí)線程被掛起,直至接收到通知被喚醒或超時(shí)(如果提供了timeout參數(shù)的話)蒜茴。當(dāng)線程被喚醒并重新占有瑣的時(shí)候,程序才會(huì)繼續(xù)執(zhí)行下去。
Condition.notify():
喚醒一個(gè)掛起的線程(如果存在掛起的線程)浆西。注意:notify()方法不會(huì)釋放所占用的瑣粉私。
Condition.notify_all()
Condition.notifyAll()
喚醒所有掛起的線程(如果存在掛起的線程)。注意:這些方法不會(huì)釋放所占用的瑣近零。

from threading import Thread, Condition
import time
import random
queue = []
MAX_NUM = 10
condition = Condition()
class ProducerThread(Thread):
  def run(self):
    nums = range(5)
    global queue
    while True:
      condition.acquire()
      if len(queue) == MAX_NUM:
        print ("Queue full, producer is waiting" )
        condition.wait()
        print ("Space in queue, Consumer notified the producer" )
      num = random.choice(nums)
      queue.append(num)
      print ("Produced", num)
      condition.notify()
      condition.release()
      time.sleep(random.random())
 
class ConsumerThread(Thread):
  def run(self):
    global queue
    while True:
      condition.acquire()
      if not queue:
        print ("Nothing in queue, consumer is waiting")
        condition.wait()
        print "Producer added something to queue and notified the consumer"
      num = queue.pop(0)
      print ("Consumed", num)
      condition.notify()
      condition.release()
      time.sleep(random.random())
ProducerThread().start()
ConsumerThread().start()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末诺核,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子久信,更是在濱河造成了極大的恐慌窖杀,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件入篮,死亡現(xiàn)場離奇詭異陈瘦,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進(jìn)店門痊项,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锅风,“玉大人,你說我怎么就攤上這事鞍泉≈宀海” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵咖驮,是天一觀的道長边器。 經(jīng)常有香客問我,道長托修,這世上最難降的妖魔是什么忘巧? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮睦刃,結(jié)果婚禮上砚嘴,老公的妹妹穿的比我還像新娘。我一直安慰自己涩拙,他們只是感情好际长,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著兴泥,像睡著了一般工育。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上搓彻,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天如绸,我揣著相機(jī)與錄音,去河邊找鬼好唯。 笑死竭沫,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的骑篙。 我是一名探鬼主播蜕提,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼靶端!你這毒婦竟也來了谎势?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤杨名,失蹤者是張志新(化名)和其女友劉穎脏榆,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體台谍,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡须喂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坞生。...
    茶點(diǎn)故事閱讀 40,505評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡仔役,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出是己,到底是詐尸還是另有隱情又兵,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布卒废,位于F島的核電站沛厨,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏摔认。R本人自食惡果不足惜逆皮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望级野。 院中可真熱鬧页屠,春花似錦、人聲如沸蓖柔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽况鸣。三九已至,卻和暖如春竹观,著一層夾襖步出監(jiān)牢的瞬間镐捧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工臭增, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留懂酱,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓誊抛,卻偏偏與公主長得像列牺,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子拗窃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評論 2 359

推薦閱讀更多精彩內(nèi)容