python threading condition使用_python多线程threading.Condition示例及解析

很多时候只有通过源码才能看清其本质,示例参考来源:http://blog.csdn.net/jgood/article/details/4305604

import threading, time

class 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...')

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值