Python多线程之threading之Semaphore对象

threading之Semaphore对象

信号量

  • 简介: 信号量是操作系统管理的一种抽象数据类型, 用于在多线程中同步对共享资源的使用. 本质上说, 信号量是一个内部数据, 用于标明当前的共享资源可以有多少并发读取.

  • threading模块中的信号量Semaphore对象. 其有两个操作函数, 即acquire()release().

    • 每当线程想要读取关联了信号量的共享资源时,必须调用acquire(), 此操作减少信号量的内部变量, 如果此变量的值非负, 那么分配该资源的权限. 如果是负值, 那么线程被挂起, 直到有其他的线程释放资源.
    • 当线程不再需要该共享资源, 必须通过release()释放. 这样, 信号量的内部变量增加, 在信号量等待队列中排在最前面的线程会拿到共享资源的权限.
    image
  • 信号量代码示例(生产者消费者):

    # -*- coding: utf-8 -*-
    import threading
    import time
    import random
    
    
    semaphore = threading.Semaphore(value=0)
    
    
    def consumer():
        print("consumer is waiting")
        semaphore.acquire()
        print("Consumer notify: consumerd item number {}".format(item))
    
    
    def producer():
        global item
        time.sleep(10)
        item = random.randint(0, 1000)
        print("producer notify: produced item number {}".format(item))
        semaphore.release()
    
    
    if __name__ == '__main__':
        for i in range(5):
            t1 = threading.Thread(target=producer)
            t2 = threading.Thread(target=consumer)
            t1.start()
            t2.start()
            t1.join()
            t2.join()
        print("program done")
    
  • 死锁情况

    • 例如, 当一个线程t1先等待读取信号量s1, 然后等待释放信号量s2, 而线程t2会先等待读取信号量s2, 然后等待释放信号量s1, 这样就会发生死锁. 导致t1等待t2释放信号量s1, 但t2等待t1释放信号量s2.

引用

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 线程 操作系统线程理论 线程概念的引入背景 进程 之前我们已经了解了操作系统中进程的概念,程序并不能单独运行,只有...
    go以恒阅读 1,694评论 0 6
  • 环境 xubuntu anaconda pycharm python https://www.cnblogs.co...
    Ericoool阅读 1,933评论 0 0
  • 写在前面的话 代码中的# > 表示的是输出结果 输入 使用input()函数 用法 注意input函数输出的均是字...
    FlyingLittlePG阅读 3,002评论 0 9
  • 线程状态新建,就绪,运行,阻塞,死亡。 线程同步多线程可以同时运行多个任务,线程需要共享数据的时候,可能出现数据不...
    KevinCool阅读 831评论 0 0
  • class threading.Thread(group=None,target=None,name=None,a...
    SkTj阅读 492评论 0 2