python并发编程多进程 模拟抢票实现过程

  • 时间:
  • 浏览:12

 抢票是并收履行

多个历程能够拜候统一个文件

多个历程同享统一文件,我们能够把文件当数据库,用多个历程摹拟多小我履行抢票使命

db.txt

{"count": 1}

并收运转,效力下,但合作写统一文件,数据写进庞杂,只要1张票,皆卖胜利给了10小我

#文件db.txt的内容为:{"count":1}
#留意1定要用单引号,否则json没法辨认
from multiprocessing import Process
import time
import json
class Foo(object):
  def search(self, name):
    with open("db.txt", "r") as f_read:
      dic = json.load(f_read)
      time.sleep(1) # 摹拟读数据的收集提早
      print("<%s>用户 检察盈余票数为 [%s]" % (name, dic["count"]))
  def get(self, name):
    with open("db.txt", "r") as f_read:
      dic = json.load(f_read)
      if dic["count"] > 0:
        dic["count"] -= 1
        time.sleep(1) # 摹拟写数据的收集提早
        with open("db.txt", "w") as f_write:
          json.dump(dic, f_write)
          print("<%s> 购票胜利" % name)
          print("盈余票数为 [%s]" % dic["count"])
      else:
        print("出票了,抢光了")
  def task(self, name):
    self.search(name)
    self.get(name)
if __name__ == "__main__":
  obj = Foo()
  for i in range(1,11):  # 摹拟并收10个客户端抢票
    p = Process(target=obj.task, args=("路人%s" % i,))
    p.start()

总结:法式呈现数据写进庞杂

各人皆查到票为1,皆购票胜利

<路人1>用户 检察盈余票数为 [1]
<路人2>用户 检察盈余票数为 [1]
<路人3>用户 检察盈余票数为 [1]
<路人4>用户 检察盈余票数为 [1]
<路人5>用户 检察盈余票数为 [1]
<路人6>用户 检察盈余票数为 [1]
<路人7>用户 检察盈余票数为 [1]
<路人8>用户 检察盈余票数为 [1]
<路人9>用户 检察盈余票数为 [1]
<路人10>用户 检察盈余票数为 [1]
<路人1> 购票胜利
盈余票数为 [0]
<路人2> 购票胜利
盈余票数为 [0]
<路人3> 购票胜利
盈余票数为 [0]
<路人4> 购票胜利
盈余票数为 [0]
<路人5> 购票胜利
盈余票数为 [0]
<路人6> 购票胜利
盈余票数为 [0]
<路人7> 购票胜利
盈余票数为 [0]
<路人8> 购票胜利
盈余票数为 [0]
<路人9> 购票胜利
盈余票数为 [0]
<路人10> 购票胜利
盈余票数为 [0]

总结法式呈现数据写进庞杂

减锁处置:购票行动由并收酿成了串止,捐躯了运转效力,但包管了数据平安

购票功用不该该并收履行,查票应当是并收履行的

查票准禁绝确没有主要,有能够那张票便被他人购走

1小我写完当前,让别的1小我基于上1小我写的成果,再做购票操纵

#把文件db.txt的内容重置为:{"count":1}
from multiprocessing import Process
from multiprocessing import Lock
import time
import json
class Foo(object):
  def search(self, name):
    with open("db.txt", "r") as f_read:
      dic = json.load(f_read)
      time.sleep(1) # 摹拟读数据的收集提早
      print("<%s>用户 检察盈余票数为 [%s]" % (name, dic["count"]))
  def get(self, name):
    with open("db.txt", "r") as f_read:
      dic = json.load(f_read)
      if dic["count"] > 0:
        dic["count"] -= 1
        time.sleep(1) # 摹拟写数据的收集提早
        with open("db.txt", "w") as f_write:
          json.dump(dic, f_write)
          print("<%s> 购票胜利" % name)
          print("盈余票数为 [%s]" % dic["count"])
      else:
        print("出票了,抢光了")
  def task(self, name, mutex):
    self.search(name)
    mutex.acquire()
    self.get(name)
    mutex.release()
if __name__ == "__main__":
  mutex = Lock()
  obj = Foo()
  for i in range(1,11): # 摹拟并收10个客户端抢票
    p = Process(target=obj.task, args=("路人%s" % i, mutex))
    p.start()

履行成果

<路人2>用户 检察盈余票数为 [1]
<路人3>用户 检察盈余票数为 [1]
<路人1>用户 检察盈余票数为 [1]
<路人4>用户 检察盈余票数为 [1]
<路人5>用户 检察盈余票数为 [1]
<路人7>用户 检察盈余票数为 [1]
<路人6>用户 检察盈余票数为 [1]
<路人8>用户 检察盈余票数为 [1]
<路人9>用户 检察盈余票数为 [1]
<路人10>用户 检察盈余票数为 [1]
<路人2> 购票胜利
盈余票数为 [0]
出票了,抢光了
出票了,抢光了
出票了,抢光了
出票了,抢光了
出票了,抢光了
出票了,抢光了
出票了,抢光了
出票了,抢光了
出票了,抢光了

with lock

相称于lock.acquire(),履行完自代码块主动履行lock.release()

from multiprocessing import Process
from multiprocessing import Lock
import time
import json
class Foo(object):
  def search(self, name):
    with open("db.txt", "r") as f_read:
      dic = json.load(f_read)

      time.sleep(1) # 摹拟读数据的收集提早
      print("<%s>用户 检察盈余票数为 [%s]" % (name, dic["count"]))
  def get(self, name):
    with open("db.txt", "r") as f_read:
      dic = json.load(f_read)
      if dic["count"] > 0:
        dic["count"] -= 1
        time.sleep(1) # 摹拟写数据的收集提早
        with open("db.txt", "w") as f_write:
          json.dump(dic, f_write)
          print("<%s> 购票胜利" % name)
          print("盈余票数为 [%s]" % dic["count"])
      else:
        print("出票了,抢光了")
  def task(self, name, mutex):
    self.search(name)
    with mutex: # 相称于lock.acquire(),履行完自代码块主动履行lock.release()
      self.get(name)
if __name__ == "__main__":
  mutex = Lock()
  obj = Foo()
  for i in range(1,11): # 摹拟并收10个客户端抢票
    p = Process(target=obj.task, args=("路人%s" % i, mutex))
    p.start()

以上便是本文的全数内容,期望对各人的进修有所帮忙,也期望各人多多撑持剧本之家。