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