进程(二)
进程同步(multiprocess.Lock)
锁------ multiprocess.Lock

1 import os 2 import time 3 import random 4 from multiprocessing import Process 5 6 def work(n): 7 print('%s:' %s is running' %(n,os.getpid())) 8 time.sleep(random.random) 9 print('%s:%s is done' %(n,os.getpid())) 10 11 if __name__ == '__main__': 12 for i in rang(3): 13 p = Process(target = work,args = (i,)) 14 p.start() 15多进程抢占输出资源

1 import os 2 import time 3 import random 4 from multiprocess import Process,Lock 5 def work(lock,n): 6 lock.acquire() 7 print('%s: %s is running' %(n,os.getpid())) 8 time.sleep(random.random) 9 print('%s: %s is done' %(n,getpid())) 10 lock.release() 11 12 if __name__ == '__main__': 13 lock = Lock() 14 for i in range(3): 15 p = Process(target = work,args =(lock,i)) 16 p.start()使用锁维护执行顺序
例子:模拟抢票,数据安全性

1 创建一个文件ticket:{"ticket:5"} 2 注意一定要用双引号,不然json无法识别 3 并发运行,效率高 4 import time,json,random 5 from multiprocessing import Process,Lock 6 7 def show(): 8 with open('ticket') as f: 9 dic = json.load(f) 10 print('余票:'%s' %dic['ticket']) 11 12 def buy_ticket(): 13 lock.acquire() #拿钥匙 14 with open ('ticket') as f: 15 dic = json.load(f) 16 time.sleep(0.1) #模拟读数据的网络延迟 17 if dic['ticket']>0: 18 dic['ticket'] -=1 19 time.sleep(random.random()) #模拟读数据的网络延迟 20 print('\033[32m购票成功\033[0m') 21 else: 22 print('\033[[31m购票失败,票已售完\033[0m') 23 time.sleep(0.1) 24 with open ('ticket','w') as f: 25 json.dump(dic,f) 26 lock.release() #还钥匙 27 28 if __name__ == '__main__': 29 for i in range(10): 30 p = Process(target = show,args=(i,)) 31 p.start() 32 lock = Lock() 33 for i in range(10): 34 p = Process(target = buy_ticket,args = (i,)) 35 p.start()使用锁保证数据安全
1 加锁可以保证多个进程修改同一块数据时,同一时间只能有一个任务可以进行修改,即串行的修改,速度相对会慢,但是却保证了数据安全、顺序 2 3 4 解决方案兼顾:1.既能效率高(多个进程共享一块内存的数据)2.帮我们处理好锁的问题。这就是multiprocessing 模块为我们提供的基于消息的IPC通信机制:队列和管道。
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

更多精彩