您的位置:首页 > 编程语言 > Python开发

python线程锁和线程通知事件

2017-05-11 11:04 260 查看
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()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: