锁、信号量
#模块:Lock #导入方法:from multiprocessing import Process,Lock #模块方法: l=Lock() l.acquire() #对所访问的资源加锁 l.release() #释放锁 #使用方法:一般在需要访问的资源的那部分代码加锁释放锁,但在初学阶段可以先包含整段程序 ###########模拟抢票程序 from multiprocessing import Process,Lock import time #在进行买票的时候,多个进程间有可能会出现第一个进程虽然先到达了,但是刚好时间片用完,这时候就会使得第一个到达的不一定会先买得到票 #不加锁的话,有可能在打开文件的时候另一个进程也打开了该文件,导致买到票的一个进程中的结果没有保存就被另一个进程所用了,以至于可能造成一张票多个人购买成功的情况 def check(i): with open("residue") as f: count=int(f.read()) #文件读取时为字符串类型,需要转为整数类型进行判断 if count>0: print("第{}个人查到了余票为{}".format(i,count)) else: print("已经没有票了") def purchase(i,l): #进行加锁操作 l.acquire() with open("residue") as f: count = int(f.read()) time.sleep(0.1) if count>0: print("第{}个人买到票了".format(i)) count-=1 else: print("\033[31m第{}个人买不到票\033[1m".format(i)) time.sleep(0.1) # 是指 买完票后,把余票数量重写写入数据库的时间延迟 with open("residue",'w') as f: f.write(str(count)) # 写入文件需要以字符串的形式写入文件,所以需要将整数类型进行强制转换为字符串类型 l.release() if __name__=="__main__": #多个进程查票 for i in range(1,10): p=Process(target=check,args=(i+1,)) p.start() #多个进程进行购票 #先实例化Lock对象 l=Lock() #再将l以参数的方式传进去 for i in range(1,10): p=Process(target=purchase,args=(i+1,l)) p.start() ###########银行存取钱原理 from multiprocessing import Process,Value,Lock import time def get_money(num,l):# 取钱 l.acquire()# 拿走钥匙,锁上门,不允许其他人进屋 for i in range(100): num.value -= 1 print(num.value) time.sleep(0.01) l.release()# 还钥匙,打开门,允许其他人进屋 def put_money(num,l):# 存钱 l.acquire() for i in range(100): num.value += 1 print(num.value) time.sleep(0.01) l.release() if __name__ == '__main__': num = Value('i',100) l = Lock() p = Process(target=get_money,args=(num,l)) p.start() p1 = Process(target=put_money, args=(num,l)) p1.start() p.join() p1.join() print(num.value)
#模块:Semaphore #导入方法:from multiprocessing import Process,Semaphore #模块方法: sem=Semaphore(i) #i是一个(房间)允许i个进程进入 sem.acquire() #对所访问的资源加锁 sem.release() #释放锁 #使用方法:类似于锁 #信号量和锁相似:通俗理解,锁机制是一个房间只能一个进程进去,而信号量机制是一个房间允许i个进程进去 #信号量和锁区别:信号量机制比锁机制多了一个计数器,这个计数器是用来记录当前剩余几把钥匙的。 当计数器为0时,表示没有钥匙了,此时acquire()处于阻塞。 对于计数器来说,每acquire一次,计数器内部就减1,release一次,计数器就加1 from multiprocessing import Process,Semaphore import time import random def func(i,sem): #信号量实现的开始 sem.acquire() print("第{}个人进入".format(i)) time.sleep(random.randint(3,5)) print("第{}个人退出".format(i)) #信号量实现的结束 sem.release() if __name__=="__main__": #允许count个进程访问资源 count=5 sem = Semaphore(count) for i in range(10): p=Process(target=func,args=(i,sem)) p.start()