• 信号量、Event、定时器


    信号量

    信号量也是一把锁,可以指定信号量为5,对比互斥锁同一时间只能有一个任务抢到锁去执行,信号量同一时间可以有5个任务拿到锁去执行,如果说互斥锁是合租房屋的人去抢一个厕所,那么信号量就相当于一群路人争抢公共厕所,公共厕所有多个坑位,这意味着同一时间可以有多个人上公共厕所,但公共厕所容纳的人数是一定的,这便是信号量的大小

    from  threading import Thread,Semaphore,currentThread
    import random
    import time
    
    sm = Semaphore(3)
    def func():
        with sm:
            print('%s in' %currentThread().getName())
            time.sleep(random.randint(1,3))
    if __name__ == '__main__':
        for i in range(10):
            t=Thread(target=func)
            t.start()

    解析

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

    Event

    线程的一个关键特性是每个线程都是独立运行且状态不可预测。如果程序中的其 他线程需要通过判断某个线程的状态来确定自己下一步的操作,这时线程同步问题就会变得非常棘手。为了解决这些问题,我们需要使用threading库中的Event对象。 对象包含一个可由线程设置的信号标志,它允许线程等待某些事件的发生。在 初始情况下,Event对象中的信号标志被设置为假。如果有线程等待一个Event对象, 而这个Event对象的标志为假,那么这个线程将会被一直阻塞直至该标志为真。一个线程如果将一个Event对象的信号标志设置为真,它将唤醒所有等待这个Event对象的线程。如果一个线程等待一个已经被设置为真的Event对象,那么它将忽略这个事件, 继续执行

    from threading import Event
    
    event.isSet():返回event的状态值;
    
    event.wait():如果 event.isSet()==False将阻塞线程;
    
    event.set(): 设置event的状态值为True,所有阻塞池的线程激活进入就绪状态, 等待操作系统调度;
    
    event.clear():恢复event的状态值为False。
    from threading import Thread,Event,currentThread
    import time
    
    event=Event()
    
    def conn():
        n=0
        while not event.is_set():
            if n == 3:
                print('%s try too many times' %currentThread().getName())
                return
            print('%s try %s' %(currentThread().getName(),n))
            event.wait(0.5)
            n+=1
    
        print('%s is connected' %currentThread().getName())
    
    
    def check():
        print('%s is checking' %currentThread().getName())
        time.sleep(5)
        event.set()
    
    
    if __name__ == '__main__':
        for i in range(3):
            t=Thread(target=conn)
            t.start()
        t=Thread(target=check)
        t.start()
    

    定时器

    定时器,指定n秒后执行某操作

    from threading import Timer
    
    def run():
        hello()
    
    def hello():
        print("hello world")
    t = Timer(10, run)
    t.start()  
  • 相关阅读:
    【组合数学】不相邻问题
    【贪心优化DP】B. 小 A 的卡牌游戏
    【数据结构】【基础莫队】P1494 [国家集训队]小Z的袜子
    【二分】【拓扑排序】CF1100E Andrew and Taxi
    【 思维】【DFS联通块】CF986C AND Graph
    【前缀异或和】【字典树】CF665E Beautiful Subarrays
    【逆序对】【树状数组+离散化】CF220E Little Elephant and Inversions
    【数论】数论分块
    【维护】【线段树】CF413E Maze 2D
    centos下yum执行报错:Failed to download metadata for repo 'AppStream': Cannot prepare internal mirrorlist: No URLs in mirrorlist
  • 原文地址:https://www.cnblogs.com/yjiu1990/p/9263263.html
Copyright © 2020-2023  润新知