線程 通訊

Condition

Condition(條件變量)一般與一個鎖關聯。須要在多個Contidion中共享一個鎖時,能夠傳遞一個Lock/RLock實例給構造方法,不然它將本身生成一個RLock實例。 html

能夠認爲,除了Lock帶有的鎖定池外,Condition還包含一個等待池,池中的線程處於狀態圖中的等待阻塞狀態,直到另外一個線程調用notify()/notifyAll()通知;獲得通知後線程進入鎖定池等待鎖定。ui

構造方法:
Condition([lock/rlock])spa

實例方法:
acquire([timeout])/release(): 調用關聯的鎖的相應方法。
wait([timeout]): 調用這個方法將使線程進入Condition的等待池等待通知,並釋放鎖。使用前線程必須已得到鎖定,不然將拋出異常。
notify(): 調用這個方法將從等待池挑選一個線程並通知,收到通知的線程將自動調用acquire()嘗試得到鎖定(進入鎖定池);其餘線程仍然在等待池中。調用這個方法不會釋放鎖定。使用前線程必須已得到鎖定,不然將拋出異常。
notifyAll(): 調用這個方法將通知等待池中全部的線程,這些線程都將進入鎖定池嘗試得到鎖定。調用這個方法不會釋放鎖定。使用前線程必須已得到鎖定,不然將拋出異常。線程

例子是很常見的生產者/消費者模式:code

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# encoding: UTF-8
import threading
import time
 
# 商品
product = None
# 條件變量
con = threading.Condition()
 
# 生產者方法
def produce():
     global product
    
     if con.acquire():
         while True :
             if product is None :
                 print 'produce...'
                 product = 'anything'
                
                 # 通知消費者,商品已經生產
                 con.notify()
            
             # 等待通知
             con.wait()
             time.sleep( 2 )
 
# 消費者方法
def consume():
     global product
    
     if con.acquire():
         while True :
             if product is not None :
                 print 'consume...'
                 product = None
                
                 # 通知生產者,商品已經沒了
                 con.notify()
            
             # 等待通知
             con.wait()
             time.sleep( 2 )
 
t1 = threading.Thread(target = produce)
t2 = threading.Thread(target = consume)
t2.start()
t1.start()
相關文章
相關標籤/搜索