Python的Lock和condition使用

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 time
import threading
class 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, 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
        """
       
# 释放nwaiter锁,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使用

你可能感兴趣的:(python)