python线程中的semaphore信号量是什么

Python (216) 2023-05-04 15:53:19

python中的线程之semaphore信号量

semaphore是一个内置的计数器,每当调用acquire()时,内置计数器-1;每当调用release()时,内置计数器+1。

计数器不能小于0,当计数器为0时,acquire()将阻塞线程直到其他线程调用release()。

来看下面的代码:

importtime
importthreading
deffoo():
time.sleep(2)#程序休息2秒
print("ok",time.ctime())
foriinrange(20):
t1=threading.Thread(target=foo,args=())#实例化一个线程
t1.start()#启动线程

执行结果:

okTueJul1820:05:582017
okTueJul1820:05:582017
okTueJul1820:05:582017
okTueJul1820:05:582017
okTueJul1820:05:582017
okTueJul1820:05:582017
okTueJul1820:05:582017
okTueJul1820:05:582017
okTueJul1820:05:582017
okTueJul1820:05:582017
okTueJul1820:05:582017
okTueJul1820:05:582017
okTueJul1820:05:582017
okTueJul1820:05:582017
okTueJul1820:05:582017
okTueJul1820:05:582017
okTueJul1820:05:582017
okTueJul1820:05:582017
okTueJul1820:05:582017
okTueJul1820:05:582017

可以看到,程序会在很短的时间内生成20个线程来打印一句话。

如果在主机执行IO密集型任务的时候再执行这种类型的程序时,计算机就有很大可能会宕机。

这时候就可以为这段程序添加一个计数器功能,来限制一个时间点内的线程数量。

相关推荐:《Python视频教程》

代码如下:

importtime
importthreading
s1=threading.Semaphore(5)#添加一个计数器
deffoo():
s1.acquire()#计数器获得锁
time.sleep(2)#程序休眠2秒
print("ok",time.ctime())
s1.release()#计数器释放锁
foriinrange(20):
t1=threading.Thread(target=foo,args=())#创建线程
t1.start()#启动线程

执行结果:

okTueJul1820:04:382017
okTueJul1820:04:382017
okTueJul1820:04:382017
okTueJul1820:04:382017
okTueJul1820:04:382017
okTueJul1820:04:402017
okTueJul1820:04:402017
okTueJul1820:04:402017
okTueJul1820:04:402017
okTueJul1820:04:402017
okTueJul1820:04:422017
okTueJul1820:04:422017
okTueJul1820:04:422017
okTueJul1820:04:422017
okTueJul1820:04:422017
okTueJul1820:04:442017
okTueJul1820:04:442017
okTueJul1820:04:442017
okTueJul1820:04:442017
okTueJul1820:04:442017
THE END

发表回复