前言
在前面的博客中写了线程锁,在博客中提到,加上锁之后,多线程并行的效果就没有了,所有的线程都是串行,这个意思也就是说线程锁只允许有一个线程同时进行,这样多线程就失去了意义.而信号量是对线程锁的再次封装,可以允许多个线程同时进行,用法和线程锁一样,作用也是为了保护数据安全.
信号量的使用:
不加信号量
import time
import threading
start_time = time.time()
def foo():
time.sleep(2) #程序休眠2秒
print("ok",time.ctime())
threading_list = []
for i in range(20):
t1=threading.Thread(target=foo,args=()) #创建线程
t1.start() #启动线程
threading_list.append(t1)
for t in threading_list:
t.join()
end_time = time.time()
print('cost time {}s'.format((end_time-start_time)))
执行结果:
ok Tue Sep 17 20:21:25 2019
ok Tue Sep 17 20:21:25 2019
ok Tue Sep 17 20:21:25 2019
ok Tue Sep 17 20:21:25 2019
ok Tue Sep 17 20:21:25 2019
ok Tue Sep 17 20:21:25 2019
ok Tue Sep 17 20:21:25 2019
ok Tue Sep 17 20:21:25 2019
ok Tue Sep 17 20:21:25 2019
ok Tue Sep 17 20:21:25 2019
ok Tue Sep 17 20:21:25 2019
ok Tue Sep 17 20:21:25 2019
ok Tue Sep 17 20:21:25 2019
ok Tue Sep 17 20:21:25 2019
ok Tue Sep 17 20:21:25 2019
ok Tue Sep 17 20:21:25 2019
ok Tue Sep 17 20:21:25 2019
ok Tue Sep 17 20:21:25 2019
ok Tue Sep 17 20:21:25 2019
ok Tue Sep 17 20:21:25 2019
cost time 2.0048305988311768s
加入信号量:
import time
import threading
start_time = time.time()
s1=threading.Semaphore(5) #添加一个计数器
def foo():
s1.acquire() #计数器获得锁
time.sleep(2) #程序休眠2秒
print("ok",time.ctime())
s1.release() #计数器释放锁
threading_list = []
for i in range(20):
t1=threading.Thread(target=foo,args=()) #创建线程
t1.start() #启动线程
threading_list.append(t1)
for t in threading_list:
t.join()
end_time = time.time()
print('cost time {}s'.format((end_time-start_time)))
执行结果*:
ok Tue Sep 17 20:25:31 2019
ok Tue Sep 17 20:25:31 2019
ok Tue Sep 17 20:25:31 2019
ok Tue Sep 17 20:25:31 2019
ok Tue Sep 17 20:25:31 2019
ok Tue Sep 17 20:25:33 2019
ok Tue Sep 17 20:25:33 2019
ok Tue Sep 17 20:25:33 2019
ok Tue Sep 17 20:25:33 2019
ok Tue Sep 17 20:25:33 2019
ok Tue Sep 17 20:25:35 2019
ok Tue Sep 17 20:25:35 2019
ok Tue Sep 17 20:25:35 2019
ok Tue Sep 17 20:25:35 2019
ok Tue Sep 17 20:25:35 2019
ok Tue Sep 17 20:25:37 2019
ok Tue Sep 17 20:25:37 2019
ok Tue Sep 17 20:25:37 2019
ok Tue Sep 17 20:25:37 2019
ok Tue Sep 17 20:25:37 2019
cost time 8.010826587677002s
写在最后
本文是个人的一些学习笔记,如有侵权,请及时联系我进行删除,谢谢大家.