threading之Semaphore对象
信号量
简介: 信号量是操作系统管理的一种抽象数据类型, 用于在多线程中同步对共享资源的使用. 本质上说, 信号量是一个内部数据, 用于标明当前的共享资源可以有多少并发读取.
-
threading
模块中的信号量Semaphore
对象. 其有两个操作函数, 即acquire()
和release()
.- 每当线程想要读取关联了信号量的共享资源时,必须调用
acquire()
, 此操作减少信号量的内部变量, 如果此变量的值非负, 那么分配该资源的权限. 如果是负值, 那么线程被挂起, 直到有其他的线程释放资源. - 当线程不再需要该共享资源, 必须通过
release()
释放. 这样, 信号量的内部变量增加, 在信号量等待队列中排在最前面的线程会拿到共享资源的权限.
- 每当线程想要读取关联了信号量的共享资源时,必须调用
-
信号量代码示例(生产者消费者):
# -*- 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.