Python队列,进程间通信,线程案例

  

<强>进程互斥锁
  

  

多进程同时抢购余票
  

        #并发运行,效率高,但竞争写同一文件,数据写入错乱   #数据。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队列,进程间通信,线程案例