美文网首页
信号量 / Event事件 / 线程Queue

信号量 / Event事件 / 线程Queue

作者: knot98 | 来源:发表于2018-09-07 15:22 被阅读0次

    一. 信号量

    同进程的一样
    Semaphore管理一个内置的计数器,
    每当调用acquire()时内置计数器-1;
    调用release() 时内置计数器+1;
    计数器不能小于0;当计数器为0时,acquire()将阻塞线程直到其他线程调用release()。
    实例:(同时只有5个线程可以获得semaphore,即可以限制最大连接数为5):

    from threading import Thread,Semaphore
    import time,random
    sm=Semaphore(5)
    
    def task(name):
        sm.acquire()
        print('%s 正在上厕所' %name)
        time.sleep(random.randint(1,3))
        sm.release()
    
    if __name__ == '__main__':
        for i in range(20):
            t=Thread(target=task,args=('路人%s' %i,))
            t.start()
    

    上文代码中将一个个线程比喻成了 正在上厕所 ,而我们知道一个厕所能同时使用的人数是一定的,只有当里面出来一个人,下一个才能进去,这就是信号量的概念!

    二. Event事件

    指的是有两个自定义线程 ,线程一 , 线程二 : 
        线程二执行的前提必须是线程一代码完完整整执行完毕后才执行线程二
        这种事件称之为Event事
    

    示例代码

    from threading import Thread,Event
    import time
    
    event=Event()
    
    def light():
        print('红灯正亮着')
        time.sleep(3)
        event.set() #绿灯亮
    
    def car(name):
        print('车%s正在等绿灯' %name)
        event.wait() #等灯绿
        print('车%s通行' %name)
    
    if __name__ == '__main__':
        # 红绿灯
        t1=Thread(target=light)
        t1.start()
        # 车
        for i in range(10):
            t=Thread(target=car,args=(i,))
            t.start()
    

    有两个线程: 红绿灯 和 车
    车线程想要通过红绿灯必须要红绿灯线程执行完毕,红灯变成绿灯时才能执行

    三. 线程Queue

    queue.Queue() #先进先出

    import queue
    
    q=queue.Queue(3)
    q.put(1)
    q.put(2)
    q.put(3)
    print(q.get())
    print(q.get())
    print(q.get())
    
    # 输出结果为 :
    1
    2
    3
    

    queue.LifoQueue() #后进先出->堆栈

    import queue
    
    q=queue.LifoQueue(3)
    q.put(1)
    q.put(2)
    q.put(3)
    print(q.get())
    print(q.get())
    print(q.get())
    
    # 输出结果为 :
    3
    2
    1
    

    queue.PriorityQueue() #优先级
    优先级,优先级用数字表示,数字越小优先级越高

    import queue
    
    q=queue.PriorityQueue(3) 
    q.put((10,'a'))
    q.put((-1,'b'))
    q.put((100,'c'))
    print(q.get())
    print(q.get())
    print(q.get())
    
    # 输出结果为 : 
    (-1, 'b')
    (10, 'a')
    (100, 'c')
    
    

    相关文章

      网友评论

          本文标题:信号量 / Event事件 / 线程Queue

          本文链接:https://www.haomeiwen.com/subject/qdecgftx.html