互斥锁
互斥锁:就是把多个进程并发,修改成一块共享数据的操作变成串行,保证是一个一个来修改的。
缺点:效率低,加锁过程复杂
优点:增加了安全性
from multiprocessing import Process,Lock import time def task(name, mutex): mutex.acquire() # 加锁 print('%s 1' %name) time.sleep(1) print('%s 2' % name) time.sleep(1) print('%s 3' % name) mutex.release() # 释放锁 if __name__ == '__main__': mutex=Lock() for i in range(3): p = Process(target=task,args=('进程%s' %i,mutex)) p.start() ''' 打印结果: 进程0 1 进程0 2 进程0 3 进程1 1 进程1 2 进程1 3 进程2 1 进程2 2 进程2 3 '''
模拟抢票
from multiprocessing import Process,Lock import json import time def search(name): time.sleep(1) # 模拟网络延迟 dic = json.load(open('db.txt','r',encoding='utf-8')) print('<%s>查看剩余票数 [%s]' %(name, dic['count'])) def get(name): time.sleep(1) dic = json.load(open('db.txt','r',encoding='utf-8')) if dic['count'] > 0: dic['count'] -= 1 time.sleep(3) json.dump(dic,open('db.txt','w',encoding='utf-8')) print('<%s> 购票成功' %name) def task(name,mutex): search(name) # 并发的进行 mutex.acquire() get(name) mutex.release() if __name__ == '__main__': mutex=Lock() for i in range(10): p=Process(target=task,args=('路人%s' %i,mutex)) p.start() ''' 打印结果: <路人0>查看剩余票数 [1] <路人4>查看剩余票数 [1] <路人1>查看剩余票数 [1] <路人2>查看剩余票数 [1] <路人5>查看剩余票数 [1] <路人3>查看剩余票数 [1] <路人8>查看剩余票数 [1] <路人6>查看剩余票数 [1] <路人7>查看剩余票数 [1] <路人9>查看剩余票数 [1] <路人0> 购票成功 '''
互斥锁和join的区别
from multiprocessing import Process,Lock import json import time ''' 互斥锁:可以让局部代码串行 join:只能让全部代码变成串行 ''' def search(name): time.sleep(1) # 模拟网络延迟 dic = json.load(open('db.txt','r',encoding='utf-8')) print('<%s>查看剩余票数 [%s]' %(name, dic['count'])) def get(name): time.sleep(1) dic = json.load(open('db.txt','r',encoding='utf-8')) if dic['count'] > 0: dic['count'] -= 1 time.sleep(3) json.dump(dic,open('db.txt','w',encoding='utf-8')) print('<%s> 购票成功' %name) else: print('<%s> 购票失败' %name) def task(name,mutex): search(name) # 并发的进行 mutex.acquire() get(name) mutex.release() if __name__ == '__main__': mutex=Lock() for i in range(3): p = Process(target=task,args=('路人%s' %i,mutex)) p.start() p.join() ''' join打印结果: <路人0>查看剩余票数 [1] <路人0> 购票成功 <路人1>查看剩余票数 [0] <路人1> 购票失败 <路人2>查看剩余票数 [0] <路人2> 购票失败 互斥锁的打印结果: <路人1>查看剩余票数 [1] <路人0>查看剩余票数 [1] <路人2>查看剩余票数 [1] <路人1> 购票成功 <路人0> 购票失败 <路人2> 购票失败 '''