• ~~并发编程(十三):信号量,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
    

    *****
    *****
  • 相关阅读:
    《数据安全实践指南》 数据销毁安全实践数据销毁处理
    《数据安全实践指南》 数据销毁安全实践介质销毁处理
    软考信息安全网络攻击原理与常用方法
    《数据安全实践指南》 通用安全实践数据安全策略规划
    软考信息安全密码学基本理论
    Discourse 清理存储空间的方法
    Java “constant string too long” 编译错误
    Java 是否应该使用通配符导入( wildcard imports)
    Java 多行字符串
    Edge 提供了标签分组功能
  • 原文地址:https://www.cnblogs.com/jevious/p/11411857.html
Copyright © 2020-2023  润新知