|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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
这是我画的结构图:
|
-
评分
-
查看全部评分
|