zoukankan      html  css  js  c++  java
  • python之信号量【Semaphore】

    # 互斥锁同时只允许一个线程更改数据,而Semaphore是同时允许一定数量的线程更改数据,比如
    # 一个厕所有3个坑,那么最多只允许3个人上厕所,后面的人只能等里面有人出来了才能再进去
    
    
    import threading
    import time
    
    def run(n):
        semaphore.acquire()
        time.sleep(1)
        print("run the thread: %s" %n)
        semaphore.release()
    
    
    if __name__ == '__main__':
        num = 0
        semaphore = threading.BoundedSemaphore(3)
        #最多允许3个线程同时运行
        for i in range(20):
            t = threading.Thread(target=run,args=[i,])
            t.start()
    
    
    while threading.active_count() != 1:
        print(threading.active_count())
        pass
    else:
        print("----all threads done----------")
        print(num)
    

      

    下面我们来详细的讲解下信号量的例子,先看下测试代码

    import threading
    import time
    
    
    def run(n):
        semaphore.acquire()
        time.sleep(1)
        print("run the thread: %s" % n)
        semaphore.release()
    
    
    if __name__ == '__main__':
        num = 0
        semaphore = threading.BoundedSemaphore(2)
        # 最多允许3个线程同时运行
        for i in range(6):
            # print(i)
            t = threading.Thread(target=run, args=[i, ])
            t.start()
    
        while threading.active_count() != 1:
            time.sleep(0.5)
            print(threading.active_count())
        else:
            print("----all threads done----------")
    

    我们会打印出当前active的线程数,这里需要注意,这个线程数还包括我们的主进程,也就是我们这里通过主进程起了6个子线程,那么他的active的线程数为7

    我们看下打印的结果

    7
    run the thread: 1
    run the thread: 0
    5
    5
    run the thread: 2
    run the thread: 3
    3
    3
    run the thread: 4
    run the thread: 5
    1
    ----all threads done----------
    

    通过上面的结果,我们可以看到active的线程数开始为7个,因为我们一共有7个线程,只要线程被start了,该线程就是active状态的

    然后线程数从7个变为5个,在变为3个,在变为1个,最后为0个,这样我们就可以清晰的看到,同时只有2个线程可以在运行

    我们下面把信号量调整为3个

    import threading
    import time
    
    
    def run(n):
        semaphore.acquire()
        time.sleep(1)
        print("run the thread: %s" % n)
        semaphore.release()
    
    
    if __name__ == '__main__':
        num = 0
        semaphore = threading.BoundedSemaphore(3)
        # 最多允许3个线程同时运行
        for i in range(6):
            # print(i)
            t = threading.Thread(target=run, args=[i, ])
            t.start()
    
        while threading.active_count() != 1:
            time.sleep(0.5)
            print(threading.active_count())
        else:
            print("----all threads done----------")
    

    结果如下

    7
    run the thread: 1
    run the thread: 0
    run the thread: 2
    4
    4
    run the thread: 5
    run the thread: 3
    run the thread: 4
    1
    ----all threads done----------
    

    最后我们不设置信号量

    测试代码如下

    import threading
    import time
    
    
    def run(n):
        # semaphore.acquire()
        time.sleep(1)
        print("run the thread: %s" % n)
        # semaphore.release()
    
    
    if __name__ == '__main__':
        num = 0
        semaphore = threading.BoundedSemaphore(3)
        # 最多允许3个线程同时运行
        for i in range(6):
            # print(i)
            t = threading.Thread(target=run, args=[i, ])
            t.start()
    
        while threading.active_count() != 1:
            time.sleep(0.5)
            print(threading.active_count())
        else:
            print("----all threads done----------")
    

    结果如下

    7
    run the thread: 0
    run the thread: 2
    run the thread: 3
    run the thread: 5
    run the thread: 1
    run the thread: 4
    1
    ----all threads done----------
    

    现在应该小伙伴们对python多线程的信号量应该掌握了把

  • 相关阅读:
    Eclipse Save Action功能
    mysql优化
    数据库从RDS迁入自己服务器上问题记录
    阿里云centos6.5安装nginx
    阿里云mysql安装
    卸载wdcp面板命令
    高性能MYSQL读书笔记1
    DelayedQueue
    spring+atomikos 实现的分布式事务
    关闭Eclipse的控制台console自动跳出
  • 原文地址:https://www.cnblogs.com/bainianminguo/p/7253922.html
Copyright © 2011-2022 走看看