进程同步(multiprocess.Lock)

锁------ multiprocess.Lock

进程(二) 随笔 第1张
 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         
多进程抢占输出资源 进程(二) 随笔 第3张
 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()
使用锁维护执行顺序

例子:模拟抢票,数据安全性

进程(二) 随笔 第5张
 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实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄