1. 基本介绍
class threading.Semaphore(value=1)
acquire(blocking=True,timeout=None)
release()
2. 简单例子
# coding: utf-8
import threading
import time
def fun(semaphore, num):
# 获得信号量,信号量减一
semaphore.acquire()
print "Thread %d is running." % num
time.sleep(3)
# 释放信号量,信号量加一
semaphore.release()
if __name__=='__main__':
# 初始化信号量,数量为2
semaphore = threading.Semaphore(2)
# 运行4个线程
for num in xrange(4):
t = threading.Thread(target=fun, args=(semaphore, num))
t.start()
运行效果:
Thread 0 is running.
Thread 1 is running.
Thread 2 is running.
Thread 3 is running.
可以注意到线程0和1是一起打印出消息的,而线程2和3是在3秒后打印的,可以得出每次只有2个线程获得信号量,进行打印。
1. 基本介绍
一个工厂函数,返回一个新的有界信号量对象。一个有界信号量会确保它当前的值不超过它的初始值。如果超过,则引发ValueError。在大部分情况下,信号量用于守护有限容量的资源。如果信号量被释放太多次,它是一种有bug的迹象。如果没有给出,value默认为1。
class threading.BoundedSemaphore(value=1)
2. 简单例子
# coding: utf-8
import threading
import time
def fun(semaphore, num):
# 获得信号量,信号量减一
semaphore.acquire()
print "Thread %d is running." % num
time.sleep(3)
# 释放信号量,信号量加一
semaphore.release()
# 再次释放信号量,信号量加一,这是超过限定的信号量数目,这时会报错ValueError: Semaphore released too many times
semaphore.release()
if __name__=='__main__':
# 初始化信号量,数量为2,最多有2个线程获得信号量,信号量不能通过释放而大于2
semaphore = threading.BoundedSemaphore(2)
# 运行4个线程
for num in xrange(4):
t = threading.Thread(target=fun, args=(semaphore, num))
t.start()