~~并发编程(十三):信号量,Event,定时器~~

进击のpython

*****

并发编程——信号量,Event,定时器


本节需要了解的就是:

信号量,以及信号量和互斥锁的区别

了解时间和定时器,以及使用


信号量

信号量也是锁,本质没有变!但是他跟互斥锁同一时间只能有一个任务抢到锁去执行来说

信号量同一时间可以有很多个任务拿到锁去执行

如果说互斥锁是一帮人抢一个厕所,那信号量就是一帮人抢夺多个厕所

def func():
    with sm:
        print('%s get sm' % threading.current_thread().getName())
        time.sleep(3)


if __name__ == '__main__':
    sm = Semaphore(5)
    for i in range(23):
        t = Thread(target=func)
        t.start()

上面的代码可能对with不够了解,作为上下文管理,也可以用在开关锁上,就像文件的打开关闭一样

  1. Semaphore管理一个内置的计数器,
  2. 每当调用acquire()时内置计数器+1
  3. 调用release() 时内置计数器-1
  4. 计数器不能小于0;当计数器为0时,acquire()将阻塞线程直到其他线程调用release()

Event事件

线程的关键特性是每个线程都是独立运行的,且状态都是深不可测的

如果需要根据A线程的运行状态来确定B进程是否运行,那可就太难了

为了解决这个问题,我们就需要Event对象,他可以设置一个标志

等到代码执行到你想要的状态的时候,他就把这个状态设置为真

你就可以接受这个状态然后执行

他有一些方法:

event.isSet():返回event的状态值;
event.wait():如果 event.isSet()==False将阻塞线程;
event.set(): 设置event的状态值为True,所有阻塞池的线程激活进入就绪状态, 等待操作系统调度;
event.clear():恢复event的状态值为False

import time
from threading import Thread, Event


def A():
    print("我是A线程,我在等待B线程执行结束.. ..")
    event.wait()
    print("我是A线程,我执行完了!")


def B():
    print('我是B线程,我要开始执行了.. .. ')
    time.sleep(1)
    print('我是B线程,我执行完了!')
    event.set()


if __name__ == '__main__':
    event = Event()
    t1 = Thread(target=A)
    t2 = Thread(target=B)
    t1.start()
    t2.start()

执行结果如下:

我是A线程,我在等待B线程执行结束.. ..
我是B线程,我要开始执行了.. .. 
我是B线程,我执行完了!
我是A线程,我执行完了!

可以看到,尽管A先执行的,

但是后面的代码是在等待着B的执行完毕才执行

所以我们的目的达到了


定时器

程序n秒之后执行

import time
from threading import Thread, Event, Timer


def A():
    print("我是A线程,我在等待B线程执行结束.. ..")
    event.wait()
    print("我是A线程,我执行完了!")


def B():
    print('我是B线程,我要开始执行了.. .. ')
    time.sleep(1)
    print('我是B线程,我执行完了!')
    event.set()


def func():
    print("都执行完了该我了!", time.time() - start_time)


if __name__ == '__main__':
    event = Event()
    t = Timer(3, func)  # 定时器,3s后执行func
    t1 = Thread(target=A)
    t2 = Thread(target=B)
    start_time = time.time()
    t.start()  # 发信号
    t1.start()
    t2.start()

我是A线程,我在等待B线程执行结束.. ..
我是B线程,我要开始执行了.. .. 
我是B线程,我执行完了!
我是A线程,我执行完了!
都执行完了该我了! 3.0026462078094482

*****
*****
原文地址:https://www.cnblogs.com/jevious/p/11411857.html