Python——信号量

信号量 某一段代码,同一时间,只能被N个进程使用

 1 import time
 2 import random
 3 from multiprocessing import Porcess
 4 from multiprocessing import Semaphore
 5 
 6 def ktv(i,sem):
 7     sem.acquire()  #获取钥匙
 8     print('%s走进ktv'%i)
 9     time.sleep(random.randint(1,5))
10     print('%s走出ktv'%i)
11     sem.release()   #换钥匙
12     
13     
14 if __name__ == '__main__':
15     sem = Semaphore(4)
16     for i in range(20):
17         p = Process(target=ktv,agrs=(i,sem))
18         p.start()
19         
View Code

 事件案例

1 from multiprocessing import Event  #事件
2 
3 e = Event()            #创建一个事件
4 print(e.is_set())  #查看时间状态,默认被设置阻塞
5 e.set()        #将事件的状态改为True
6 e.wait()  #是依据e.is_set()的值来决定是否阻塞True为不阻塞,False为阻塞
7 e.clear()  #将事件的状态改为False
实例

 红绿灯事件

 1 # 红绿灯事件
 2 import time
 3 import random
 4 from multiprocessing import Event,Process
 5 def cars(e,i):
 6     if not e.is_set():
 7         print('car%i在等待'%i)
 8         e.wait()    # 阻塞 直到得到一个 事件状态变成 True 的信号
 9     print('\033[0;32;40mcar%i通过\033[0m' % i)
10 
11 def light(e):
12     while True:
13         if e.is_set():
14             e.clear()
15             print('\033[31m红灯亮了\033[0m')
16         else:
17             e.set()
18             print('\033[32m绿灯亮了\033[0m')
19         time.sleep(2)
20 
21 if __name__ == '__main__':
22     e = Event()
23     traffic = Process(target=light,args=(e,))
24     traffic.start()
25     for i in range(20):
26         car = Process(target=cars, args=(e,i))
27         car.start()
28         time.sleep(random.random())
红绿灯

 

posted @ 2018-10-21 20:52 澄心元素 阅读(...) 评论(...) 编辑 收藏