鱼C论坛

 找回密码
 立即注册
查看: 3746|回复: 4

[技术交流] python标准库之【threading】第5讲

[复制链接]
发表于 2017-6-7 17:02:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 MSK 于 2017-6-7 18:16 编辑

上一篇:
        同步锁与递归锁,控制线程访问公共资源
下一篇:
        拾遗

内容概述
高级锁



        threading.Condition()
        可以把Condiftion理解为一把高级的琐,它提供了比Lock, RLock更高级的功能.
        threadiong.Condition在内部维护一个琐对象(默认是RLock),可以在创建Condigtion对象的时候把琐对象作为参数传入
  1. import threading
  2. lock = threading.Lock()
  3. rlock = threading.RLock()

  4. cc = threading.Condition(lock)

  5. 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()

        唤醒所有挂起的线程(如果存在挂起的线程)。注意:这些方法不会释放所占用的锁


  1. import threading
  2. import time

  3. cond = threading.Condition()

  4. def seeker(hider_name,cond):
  5.     cond.acquire()#必须先加锁,否则报错
  6.     time.sleep(1)#确保先运行hider
  7.     cond.wait()#挂起线程
  8.     print('嘿,%s,我开始找了!' % hider_name)
  9.     cond.notify()#启动线程
  10.     cond.wait()
  11.     print('哈哈我赢了')
  12.     cond.notify()
  13.     cond.release()

  14. def hider(seek_name,cond):
  15.     cond.acquire()#必须先加锁,否则报错
  16.     print('嘿,%s 我已经躲好了' % seek_name)
  17.     cond.notify()[u][/u]
  18.     cond.wait()#挂起线程
  19.     print('哎呀,被找到了')
  20.     cond.notify()
  21.     cond.wait()
  22.     print('游戏结束')
  23.     cond.release()

  24. thread_1 = threading.Thread(target=seeker,args=('躲藏者',cond))
  25. thread_2 = threading.Thread(target=hider,args=('寻找者',cond))

  26. thread_1.start()
  27. thread_2.start()
复制代码

       

        threading.Event


        Event实现与Condition类似的功能,不过比Condition简单一点。
       

        Event.wait([timeout])
        堵塞线程,直到Event对象内部标识位被设为True或超时(如果提供了参数timeout)。


        Event.set()
        将标识位设为Ture


        Event.clear()
        将标识伴设为False。


        Event.isSet()
        判断标识位是否为Ture

        这是我画的结构图:
       
condition.png

评分

参与人数 2荣誉 +3 鱼币 +6 贡献 +3 收起 理由
康小泡 + 3
小甲鱼 + 3 + 3 + 3 加油!

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-6-7 17:03:55 | 显示全部楼层
好不容易才自己整理(更改)出来一个能看的栗子
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-7 18:13:46 | 显示全部楼层
内容很诱惑,排版需加强!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-7 18:15:02 | 显示全部楼层
小甲鱼 发表于 2017-6-7 18:13
内容很诱惑,排版需加强!

好的,谢谢大大的建议
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-24 08:42:20 | 显示全部楼层
牛🐮
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-24 06:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表