day9-信号量(semaphore)互斥锁
一、概述
互斥锁 同时只允许一个线程更改数据,而Semaphore是同时允许一定数量的线程更改数据 ,比如厕所有3个坑,那最多只允许3个人上厕所,后面的人只能等里面有人出来了才能再进去。
信号量:就是在同一时间,可以只允许设定的数执行,所以设置了信号量,就有多把锁。
二、信号量
说明:这个好比有3个人上厕所,就只有3把锁,如果有人进去,就会告诉你已经有人了,已经被占领了,其他的线程只能等。我们用threading.BoundedSemaphore(线程数)来定义一个信号量,代码如下:
1 import threading,time 2 3 def run(n): 4 semaphore.acquire() # 加信号量锁 5 time.sleep(1) 6 print("run the thread: %s\n" % n) 7 semaphore.release() # 释放锁 8 9 10 if __name__ == '__main__': 11 12 semaphore = threading.BoundedSemaphore(5) # 最多允许5个线程同时运行(Bounded:绑定,Semaphore:信号量) 13 for i in range(20): 14 t = threading.Thread(target=run, args=(i,)) 15 t.start() 16 17 while threading.active_count() != 1: 18 pass # print threading.active_count() 19 else: 20 print('----all threads done---')
注意:上面程序的执行,给我们的感觉是:分了5组,这5个同时完成,又同时进5个进去。但是实际的效果是:这5个里面如果有3个完成,就会立刻再放3个进去。不会等5个都完成,每出来1个就放进去1个,出来几个放进去几个。
三、使用场景
- 连接池,线程池,MySQL的有连接池,同一时间有个并发,能连多少个连接。
- 我们为了保证我的socket_server,因为python不会默认现在你启动多少个线程,但是你启动的线程越多,就会把系统拉的越慢,就会把程序拉的越慢。这里就可以搞一个我同一时间放100线程个进来,就是用semaphore
- 最后注意的是:python3.x 虽然不加锁也是正确的,但是最好还是把锁加上。

浙公网安备 33010602011771号