Python多线程之threading之Semaphore对象

threading之Semaphore对象

信号量

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

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

    • 每当线程想要读取关联了信号量的共享资源时,必须调用acquire(), 此操作减少信号量的内部变量, 如果此变量的值非负, 那么分配该资源的权限. 如果是负值, 那么线程被挂起, 直到有其他的线程释放资源.
    • 当线程不再需要该共享资源, 必须通过release()释放. 这样, 信号量的内部变量增加, 在信号量等待队列中排在最前面的线程会拿到共享资源的权限.
    Python多线程之threading之Semaphore对象_第1张图片
    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.

引用

  • 8.使用信号量进行线程同步

你可能感兴趣的:(Python多线程之threading之Semaphore对象)