一,互斥锁:
可以将要执行任务的部分代码(只涉及到修改共享数据的代码)变成串行。
硬盘上的数据可以共享。内存中的数据是物理隔离开的。
join:是要执行任务的所有代码整体串行。
模拟 强票小软件
from multiprocessing import Process,Lock
import json,os,time,random
def check(): #查看余票
time.sleep(1) #模拟时间延迟
with open('db.txt','rt',encoding='utf-8') as f: #读取余票数
dic=json.load(f) #数据存在硬盘中,从硬盘把字典读出来,需要反序列化
print('%s 查看剩余票数%s'%(os.getpid(),dic['count']))
def get(): #购票
with open('db.txt','rt',encoding='utf-8') as f : #先读真正还剩票数
dic=json.load(f)
time.sleep(2)
if dic['count']>0: #判断如果票数大于0,说明还有票
dic['count']-=1 #购票后,票数减1
time.sleep(random.randint(1,3))
with open('db.txt','wt',encoding='utf-8') as f: #记录票数购买后的状态
json.dump(dic,f)
print('%s 购票成功'% os.getpid())
else:
print('%s 没有余票'% os.getpid())
def task(mutex): #制作子进程
check() #查票函数调用(可以并发进程)
mutex.acquire() #购票需要串行操作,一个买完之后,释放掉锁,才能下一个再来买,
get() #购票
mutex.release() #释放锁
if __name__ == '__main__':
mutex=Lock() #制作互斥锁
for i in range(10): #十个用户并发操作。
p=Process(target=task,args=(mutex,))
p.start()