前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python的Lock和conditio

Python的Lock和conditio

作者头像
py3study
发布2020-01-06 12:04:13
5390
发布2020-01-06 12:04:13
举报
文章被收录于专栏:python3

Python的Lock和condition使用

Lock是threading模块提供的锁对象,Lock默认创建的是一个锁对象,当我们需要对全局对象进行操作的时候,可以通过Lock创建对象来锁定对象,Lock对象就好比java中的synchronize(aObject)代码中的aObject对象。

而condition除了具有Lock对象的acquire方法和release方法外,还有wait、notify、notifyAll方法等用于条件处理。Condition对象可以在某些事件触发或者达到特定条件后才处理数据。很像java中锁一个对象后,对象调用notify或者notifyAll方法去触发操作。Condition还支持从外界引用一个Lock对象。

Lock示例代码如下:

#!/usr/bin/env python # -*- coding: utf-8 -*-import timeimport threadingclass MyThread(threading.Thread):     def run(self):         global counter         time.sleep(1)         # 获得锁对象         if mutex.acquire(1):             counter = counter + 1             msg = self.name + ' set counter to ' + str(counter)             print msg             #释放锁             mutex.release()# 全局变量counter = 0#产生一个互斥锁mutex = threading.Lock()def test():     for i in range(0, 5):         t = MyThread()         t.start()if __name__ == '__main__':     test()

输出内容:

Thread-1 set counter to 1 Thread-3 set counter to 2 Thread-2 set counter to 3 Thread-4 set counter to 4 Thread-5 set counter to 5

Condition代码示例:

#!/usr/bin/env python # -*- coding: utf-8 -*-import threading, timeclass Seeker(threading.Thread):     def __init__(self, cond, name):         super(Seeker, self).__init__()         self.cond = cond         self.name = name     def run(self):         self.cond.acquire()         print self.name + ': 我已经把眼睛蒙上了'         """         notify源码解析:             __waiters = self.__waiters             waiters = __waiters[:n] # 获取等待队列中的n个等待锁             for waiter in waiters:             waiter.release() # 释放Hider的等待锁             try:                 __waiters.remove(waiter)             except ValueError:                 pass         """         # 释放n个waiter锁,waiter线程准备执行         self.cond.notify()         print('notifyed...')         # 释放condition条件锁,waiter线程Hider真正开始执行         self.cond.wait()         print('waited...')         print self.name + ': 我找到你了 ~_~'         self.cond.notify()         self.cond.release()         print self.name + ': 我赢了'class Hider(threading.Thread):     def __init__(self, cond, name):         super(Hider, self).__init__()         self.cond = cond         self.name = name     def run(self):         self.cond.acquire()         """         wait()源码解析:             waiter = _allocate_lock() # 创建一把等待锁,加入waiters队列,等待notify唤醒             waiter.acquire() # 获取锁             self.__waiters.append(waiter)             saved_state = self._release_save() # 释放condition.lock全局条件锁,以便其他等待线程执行             if timeout is None:                 waiter.acquire() # 再次获取锁,因为已经锁定无法继续,等待notify执行release         """         # wait()释放对琐的占用,同时线程挂起在这里,直到被notify并重新占有琐。         self.cond.wait()         print self.name + ': 我已经藏好了,你快来找我吧'         self.cond.notify()         self.cond.wait()         self.cond.release()         print self.name + ': 被你找到了,哎~~~'cond = threading.Condition() hider = Hider(cond, 'hider') seeker = Seeker(cond, 'seeker') hider.start() seeker.start() hider.join() seeker.join()print('end...')

输出结果:

seeker: 我已经把眼睛蒙上了 notifyed... hider: 我已经藏好了,你快来找我吧 waited... seeker: 我找到你了 ~_~ seeker: 我赢了  hider: 被你找到了,哎~~~ end...

Python的Lock和condition使用

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/09/26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档