Semaphore
对象内部管理一个计数器,该计数器由每一个acquire()
调用递减,并由每一个release()
调用递增。计数器永远不会低于零,当acquire()
发现计数器为零时,线程阻塞,等待其余线程调用release()
。
Semaphore
对象支持上下文管理协议。
方法:
acquire(blocking=True, timeout=None)
获取信号。
当blocking=True
时:若是调用时计数器大于零,则将其减1并当即返回。若是在调用时计数器为零,则阻塞并等待,直到其余线程调用release()
使其大于零。这是经过适当的互锁来完成的,所以若是多个acquire()
被阻塞,release()
将只唤醒其中一个,这个过程会随机选择一个,所以不该该依赖阻塞线程的被唤醒顺序。
返回值为True
。
当blocking=False
时,不会阻塞。若是调用acquire()
时计数器为零,则会当即返回False
.
若是设置了timeout
参数,它将阻塞最多timeout
秒。若是在该时间段内没有获取锁,则返回False
,不然返回True
。python
release()
释放信号,使计数器递增1。当计数器为零并有另外一个线程等待计数器大于零时,唤醒该线程。app
实现有界信号对象。有界信号对象确保计数器不超过初始值value
,不然抛出ValueError
。
大多数状况下,该对象用于保护有限容量的资源。ui
栗子:线程
# -*- coding:utf-8 -*- import threading import time sem = threading.Semaphore(3) class DemoThread(threading.Thread): def run(self): print('{0} is waiting semaphore.'.format(self.name)) sem.acquire() print('{0} acquired semaphore({1}).'.format(self.name, time.ctime())) time.sleep(5) print('{0} release semaphore.'.format(self.name)) sem.release() if __name__ == '__main__': threads = [] for i in range(4): threads.append(DemoThread(name='Thread-' + str(i))) for t in threads: t.start() for t in threads: t.join()
运行结果:code
Thread-0 is waiting semaphore. Thread-0 acquired semaphore(Thu Oct 25 20:33:18 2018). Thread-1 is waiting semaphore. Thread-1 acquired semaphore(Thu Oct 25 20:33:18 2018). Thread-2 is waiting semaphore. Thread-2 acquired semaphore(Thu Oct 25 20:33:18 2018). Thread-3 is waiting semaphore. Thread-0 release semaphore. Thread-3 acquired semaphore(Thu Oct 25 20:33:23 2018). Thread-1 release semaphore. Thread-2 release semaphore. Thread-3 release semaphore.
能够看到Thread-3
是在Thread-0
释放后才得到信号对象。orm