马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 MSK 于 2017-6-7 18:16 编辑
上一篇:
同步锁与递归锁,控制线程访问公共资源
下一篇:
拾遗
内容概述
高级锁
threading.Condition()
可以把Condiftion理解为一把高级的琐,它提供了比Lock, RLock更高级的功能.
threadiong.Condition在内部维护一个琐对象(默认是RLock),可以在创建Condigtion对象的时候把琐对象作为参数传入
import threading
lock = threading.Lock()
rlock = threading.RLock()
cc = threading.Condition(lock)
dd = threading.Condition(rlock)
Condition也提供了acquire, release方法,其含义与锁的acquire, release方法一致
Condition还提供了如下方法(特别要注意:这些方法只有在占用锁(acquire)之后才能调用,否则将会报RuntimeError异常。)
Condition.wait([timeout]):
wait方法释放内部所占用的琐,同时线程被挂起,直至接收到通知被唤醒或超时(如果提供了timeout参数的话)。当线程被唤醒并重新占有锁的时候,程序才会继续执行下去。
Condition.notify():
唤醒一个挂起的线程(如果存在挂起的线程)。注意:notify()方法不会释放所占用的锁。
Condition.notify_all()
Condition.notifyAll()
唤醒所有挂起的线程(如果存在挂起的线程)。注意:这些方法不会释放所占用的锁。
import threading
import time
cond = threading.Condition()
def seeker(hider_name,cond):
cond.acquire()#必须先加锁,否则报错
time.sleep(1)#确保先运行hider
cond.wait()#挂起线程
print('嘿,%s,我开始找了!' % hider_name)
cond.notify()#启动线程
cond.wait()
print('哈哈我赢了')
cond.notify()
cond.release()
def hider(seek_name,cond):
cond.acquire()#必须先加锁,否则报错
print('嘿,%s 我已经躲好了' % seek_name)
cond.notify()[u][/u]
cond.wait()#挂起线程
print('哎呀,被找到了')
cond.notify()
cond.wait()
print('游戏结束')
cond.release()
thread_1 = threading.Thread(target=seeker,args=('躲藏者',cond))
thread_2 = threading.Thread(target=hider,args=('寻找者',cond))
thread_1.start()
thread_2.start()
threading.Event
Event实现与Condition类似的功能,不过比Condition简单一点。
Event.wait([timeout])
堵塞线程,直到Event对象内部标识位被设为True或超时(如果提供了参数timeout)。
Event.set()
将标识位设为Ture
Event.clear()
将标识伴设为False。
Event.isSet()
判断标识位是否为Ture
这是我画的结构图:
|