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个,出来几个放进去几个。

三、使用场景

  1. 连接池,线程池,MySQL的有连接池,同一时间有个并发,能连多少个连接。
  2. 我们为了保证我的socket_server,因为python不会默认现在你启动多少个线程,但是你启动的线程越多,就会把系统拉的越慢,就会把程序拉的越慢。这里就可以搞一个我同一时间放100线程个进来,就是用semaphore
  3. 最后注意的是:python3.x 虽然不加锁也是正确的,但是最好还是把锁加上。

 

posted @ 2018-03-19 14:21  东郭仔  阅读(143)  评论(0)    收藏  举报