1.執行緒鎖(lock)
lock(指令鎖)是可用的最低階的同步指令。lock處於鎖定狀態時,不被特定的執行緒擁有。lock包含兩種狀態——鎖定和非鎖定,以及兩個基本的方法。
可以認為lock有乙個鎖定池,當執行緒請求鎖定時,將執行緒至於池中,直到獲得鎖定後出池。池中的執行緒處於狀態圖中的同步阻塞狀態。
構造方法:
lock()
例項方法:
acquire([timeout]):使執行緒進入同步阻塞狀態,引數獲得鎖定
release():釋放鎖。使用前線程必須已獲得鎖定,否則將跑出異常
# encoding: utf-8
import threading
import time
data = 0
lock = threading.lock()
def func():
global data
print '%s acquire lock...' % threading.currentthread().getname()
# 呼叫acquire([timeout])時,執行緒將一直阻塞,
# 直到獲得鎖定或者直到timeout秒後(timeout引數可選)。
# 返回是否獲得鎖。
if lock.acquire():
print '%s get the lock.' % threading.currentthread().getname()
data += 1
time.sleep(2)
print '%s release lock...' % threading.currentthread().getname()
# 呼叫release()將釋放鎖。
lock.release()
t1 = threading.thread(target=func)
t2 = threading.thread(target=func)
t3 = threading.thread(target=func)
t1.start()
t2.start()
t3.start()
2.執行緒通知事件(event)
event(事件)是最簡單的執行緒通訊機制之一:乙個執行緒通知事件,其他執行緒等待事件。event內建了乙個初始為false的標誌,當呼叫set()時設為true,呼叫clear()時重置為 false。wait()將阻塞執行緒至等待阻塞狀態。
構造方法:
event()
例項方法:
isset(): 當內建標誌為true時返回true。
set(): 將標誌設為true,並通知所有處於等待阻塞狀態的執行緒恢復執行狀態。
clear(): 將標誌設為false。
wait([timeout]): 如果標誌為true將立即返回,否則阻塞執行緒至等待阻塞狀態,等待其他執行緒呼叫set()。
# encoding: utf-8
import threading
import time
event = threading.event()
def func():
# 等待事件,進入等待阻塞狀態
print '%s wait for event...' % threading.currentthread().getname()
event.wait()
# 收到事件後進入執行狀態
print '%s recv event.' % threading.currentthread().getname()
t1 = threading.thread(target=func)
t2 = threading.thread(target=func)
t1.start()
t2.start()
time.sleep(2)
# 傳送事件通知
print 'mainthread set event.'
event.set()
python 執行緒池 鎖 python多執行緒和鎖
python中,有兩個標準模組thread和threading可以實現多執行緒,不過threading更加高階,推薦使用threading。threading 模組提供的常用方法 threading.currentthread 返回當前的執行緒變數。threading.enumerate 返回乙個包...
python 執行緒鎖
由於執行緒之間隨機排程 某執行緒可能在執行n條後,cpu接著執行其他執行緒。為了多個執行緒同時操作乙個記憶體中的資源時不產生混亂,我們使用鎖。lock 指令鎖 是可用的最低階的同步指令。lock處於鎖定狀態時,不被特定的執行緒擁有。lock包含兩種狀態 鎖定和非鎖定,以及兩個基本的方法。可以認為lo...
Python(執行緒鎖)
1.1 多個執行緒對同乙個資料進行修改時,可能會出現不可預料的情況.2.1 例項化物件方式實現執行緒鎖 import threading 銀行存錢和取錢 def add lock global money 宣告money為全域性變數 for i in range 1000000 2.操作變數之前進行...