from threading import Semaphore,Thread
import time,random
sm = Semaphore(5)
def task(i):
sm.acquire()#加锁
print("%s is doing" % i)
time.sleep(random.randint(1,3))
print("\n%s is leaving" % i)
sm.release()#解锁
if __name__ == "__main__":
for i in range(20):
p = Thread(target=task,args=(i,))
p.start()
设置Semaphore 即允许同时运行的线程或者进程数,比如总共有十个线程要运行,Semaphore设置为5,则同时运行的为五个
结果:
0 is doing
1 is doing
2 is doing
3 is doing
4 is doing
1 is leaving
5 is doing
2 is leaving
6 is doing
3 is leaving
7 is doing
0 is leaving
8 is doing
5 is leaving
9 is doing
4 is leaving
10 is doing
6 is leaving
11 is doing
7 is leaving
12 is doing
9 is leaving
13 is doing
8 is leaving
14 is doing
13 is leaving
15 is doing
12 is leaving
10 is leaving
11 is leaving
16 is doing
17 is doing
18 is doing
14 is leaving
19 is doing
17 is leaving
15 is leaving
19 is leaving
16 is leaving
18 is leaving
可以看出,只有一个线程运行结束了才能让另一个运行。
线程和进程里的Semaphore运用的方法一样。