<强>进程互斥锁强>
多进程同时抢购余票
#并发运行,效率高,但竞争写同一文件,数据写入错乱 #数据。json文件内容为{“ticket_num”: 1} 进口json 导入的时间 从多处理导入过程 def搜索(用户): 用开放(的数据。json”、“r”,编码=皍tf - 8”)作为f: dic=json.load (f) print (f '用户{user}查看余票,还剩{dic.get (ticket_num)}……”) def买(用户): 用开放(的数据。json”、“r”,编码=皍tf - 8”)作为f: dic=json.load (f) time . sleep (0.1) 如果dic ticket_num的祝辞0: dic [' ticket_num '] -=1 用开放(的数据。json”、“w”,编码=皍tf - 8”)作为f: json。转储(dic) print (f '用户{user}抢票成功!”) 其他: print (f '用户{user}抢票失败”) def运行(用户): 搜索(用户) 购买(用户) if __name__==癬_main__”: 因为我在范围(10):#模拟10个用户抢票 目标=p=过程(运行参数=(f的用户{我}’,)) p.start ()
使用锁来保证数据安全
#数据。json文件内容为{“ticket_num”: 1} 进口json 导入的时间 从多处理导入过程,锁 def搜索(用户): 用开放(的数据。json”、“r”,编码=皍tf - 8”)作为f: dic=json.load (f) print (f '用户{user}查看余票,还剩{dic.get (ticket_num)}……”) def买(用户): 用开放(的数据。json”、“r”,编码=皍tf - 8”)作为f: dic=json.load (f) time . sleep (0.2) 如果dic ticket_num的祝辞0: dic [' ticket_num '] -=1 用开放(的数据。json”、“w”,编码=皍tf - 8”)作为f: json。转储(dic) print (f '用户{user}抢票成功!”) 其他: print (f '用户{user}抢票失败”) def运行(用户、互斥): 搜索(用户) mutex.acquire() #加锁 购买(用户) mutex.release() #释放锁 if __name__==癬_main__”: #调用锁()类得到一个锁对象 互斥锁=() 因为我在范围(10):#模拟10个用户抢票 目标=p=过程(运行参数=(f的用户{我}’,互斥)) p.start ()
进程互斥锁:
让并发变成串行,牺牲了执行效率,保证了数据安全
在程序并发时,需要修改数据使用
<强>队列强>
队列遵循的是先进先出
队列:相当于内存中一个队列空间,可以存放多个数据,但数据的顺序是由先进去的排在前面。
q.put()添加数据
q.get()取数据,遵循队列先进先出
q.get_nowait()获取队列数据,队列中没有就会报错
。put_nowait添加数据,若队列满了也会报错
q.full()查看队列是否满了
q.empty()查看队列是否为空
从进口多处理队列 #调用队列类,实例化队列对象 q=队列(5)#队列中存放5个数据 #把添加数据,若队列里的数据满了就会卡住 q.put (1) 打印(“进入数据1 ') q.put (2) 打印(“进入数据2”) q.put (3) 打印(“进入数据3 ') q.put (4) 打印(“进入数据4”) q.put (5) 打印(“进入数据5 ') #查看队列是否满了 print (q.full ()) #添加数据,若队列满了也会报的错 q.put_nowait (6) # q.get()获取的数据遵循先进先出 print (q.get ()) print (q.get ()) print (q.get ()) print (q.get ()) print (q.get ()) #打印(q.get ()) print (q.get_nowait()) #获取队列数据,队列中没有就会报的错 #判断队列是否为空 print (q.empty ()) q.put (6) 打印(“进入数据6 ')
<强>进程间通信强>
IPC(进程间通信)
进程间数据是相互隔离的,若想实现进程间通信,可以利用队列
从多处理导入过程,队列 def task1(问): 数据=' https://www.yisu.com/zixun/hello你好” q.put(数据) 打印(“进程1添加数据到队列”) def task2(问): print (q.get ()) 打印(“进程2从队列中获取数据的) if __name__==癬_main__”: q=队列() p1=过程(目标=task1 args=(q)) p2=过程(目标=task2, arg游戏=(q)) p1.start () p2.start () 打印(“主进程”)Python队列,进程间通信,线程案例