zoukankan      html  css  js  c++  java
  • ~~并发编程(十三):信号量,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
    

    *****
    *****
  • 相关阅读:
    Delphi XE5 android 蓝牙通讯传输
    Delphi XE5 android toast
    Delphi XE5 android openurl(转)
    Delphi XE5 如何设计并使用FireMonkeyStyle(转)
    Delphi XE5 android 捕获几个事件
    Delphi XE5 android listview
    Delphi XE5 android 黑屏的临时解决办法
    Delphi XE5 android popumenu
    Delphi XE5 android 获取网络状态
    Delphi XE5 android 获取电池电量
  • 原文地址:https://www.cnblogs.com/jevious/p/11411857.html
Copyright © 2011-2022 走看看