1、semaphore是一个内置的计数器;
2、能够并发执行的线程数,超出的线程阻塞,直到有线程运行完成;
每当调用acquire()时内置计数器-1;
调用release() 时内置计数器+1;
3、计数器不能小于0;当计数器为0时,acquire()将阻塞线程直到其他线程调用release();
import time
import threading
def foo():
time.sleep(2) #程序休息2秒
print("ok",time.ctime())
for i in range(20):
t1=threading.Thread(target=foo,args=()) #实例化一个线程
t1.start() #启动线程
t1.join()
foo()
加入semaphore机制,限制一个时间点内进程的数量,保证如果在主机执行IO密集型任务的时候再执行这种类型的程序时,不会出现计算机宕机情况的发生。
import time
import threading
s1 = threading.Semaphore(2)
def foo():
s1.acquire()
time.sleep(2) #程序休息2秒
print("ok",time.ctime())
s1.release()
for i in range(20):
t1=threading.Thread(target=foo,args=()) #实例化一个线程
t1.start() #启动线程
t1.join()
foo()
*****************************************************************************************************************************************
# 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 range(4):
t = threading.Thread(target=fun, args=(semaphore, num))
t.start()
可以发现:可以注意到线程0和1是一起打印出消息的,而线程2和3是在3秒后打印的,可以得出每次只有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 range(4):
t = threading.Thread(target=fun, args=(semaphore, num))
t.start()