python執行緒鎖和執行緒通知事件

2021-07-31 22:10:23 字數 2015 閱讀 3582

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.操作變數之前進行...