python模拟app抢票_python并发编程多进程 模拟抢票实现过程
搶票是并發(fā)執(zhí)行
多個進程可以訪問同一個文件
多個進程共享同一文件,我們可以把文件當數(shù)據(jù)庫,用多個進程模擬多個人執(zhí)行搶票任務(wù)
db.txt
{"count": 1}
并發(fā)運行,效率高,但競爭寫同一文件,數(shù)據(jù)寫入錯亂,只有一張票,都賣成功給了10個人
#文件db.txt的內(nèi)容為:{"count":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) # 模擬讀數(shù)據(jù)的網(wǎng)絡(luò)延遲
print("用戶 查看剩余票數(shù)為 [%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) # 模擬寫數(shù)據(jù)的網(wǎng)絡(luò)延遲
with open("db.txt", "w") as f_write:
json.dump(dic, f_write)
print(" 購票成功" % name)
print("剩余票數(shù)為 [%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): # 模擬并發(fā)10個客戶端搶票
p = Process(target=obj.task, args=("路人%s" % i,))
p.start()
總結(jié):程序出現(xiàn)數(shù)據(jù)寫入錯亂
大家都查到票為1,都購票成功
用戶 查看剩余票數(shù)為 [1]
用戶 查看剩余票數(shù)為 [1]
用戶 查看剩余票數(shù)為 [1]
用戶 查看剩余票數(shù)為 [1]
用戶 查看剩余票數(shù)為 [1]
用戶 查看剩余票數(shù)為 [1]
用戶 查看剩余票數(shù)為 [1]
用戶 查看剩余票數(shù)為 [1]
用戶 查看剩余票數(shù)為 [1]
用戶 查看剩余票數(shù)為 [1]
購票成功
剩余票數(shù)為 [0]
購票成功
剩余票數(shù)為 [0]
購票成功
剩余票數(shù)為 [0]
購票成功
剩余票數(shù)為 [0]
購票成功
剩余票數(shù)為 [0]
購票成功
剩余票數(shù)為 [0]
購票成功
剩余票數(shù)為 [0]
購票成功
剩余票數(shù)為 [0]
購票成功
剩余票數(shù)為 [0]
購票成功
剩余票數(shù)為 [0]
總結(jié)程序出現(xiàn)數(shù)據(jù)寫入錯亂
加鎖處理:購票行為由并發(fā)變成了串行,犧牲了運行效率,但保證了數(shù)據(jù)安全
購票功能不應(yīng)該并發(fā)執(zhí)行,查票應(yīng)該是并發(fā)執(zhí)行的
查票準不準確不重要,有可能這張票就被別人買走
一個人寫完以后,讓另外一個人基于上一個人寫的結(jié)果,再做購票操作
#把文件db.txt的內(nèi)容重置為:{"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) # 模擬讀數(shù)據(jù)的網(wǎng)絡(luò)延遲
print("用戶 查看剩余票數(shù)為 [%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) # 模擬寫數(shù)據(jù)的網(wǎng)絡(luò)延遲
with open("db.txt", "w") as f_write:
json.dump(dic, f_write)
print(" 購票成功" % name)
print("剩余票數(shù)為 [%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): # 模擬并發(fā)10個客戶端搶票
p = Process(target=obj.task, args=("路人%s" % i, mutex))
p.start()
執(zhí)行結(jié)果
用戶 查看剩余票數(shù)為 [1]
用戶 查看剩余票數(shù)為 [1]
用戶 查看剩余票數(shù)為 [1]
用戶 查看剩余票數(shù)為 [1]
用戶 查看剩余票數(shù)為 [1]
用戶 查看剩余票數(shù)為 [1]
用戶 查看剩余票數(shù)為 [1]
用戶 查看剩余票數(shù)為 [1]
用戶 查看剩余票數(shù)為 [1]
用戶 查看剩余票數(shù)為 [1]
購票成功
剩余票數(shù)為 [0]
沒票了,搶光了
沒票了,搶光了
沒票了,搶光了
沒票了,搶光了
沒票了,搶光了
沒票了,搶光了
沒票了,搶光了
沒票了,搶光了
沒票了,搶光了
with lock
相當于lock.acquire(),執(zhí)行完自代碼塊自動執(zhí)行l(wèi)ock.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) # 模擬讀數(shù)據(jù)的網(wǎng)絡(luò)延遲
print("用戶 查看剩余票數(shù)為 [%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) # 模擬寫數(shù)據(jù)的網(wǎng)絡(luò)延遲
with open("db.txt", "w") as f_write:
json.dump(dic, f_write)
print(" 購票成功" % name)
print("剩余票數(shù)為 [%s]" % dic["count"])
else:
print("沒票了,搶光了")
def task(self, name, mutex):
self.search(name)
with mutex: # 相當于lock.acquire(),執(zhí)行完自代碼塊自動執(zhí)行l(wèi)ock.release()
self.get(name)
if __name__ == "__main__":
mutex = Lock()
obj = Foo()
for i in range(1,11): # 模擬并發(fā)10個客戶端搶票
p = Process(target=obj.task, args=("路人%s" % i, mutex))
p.start()
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持我們。
本文標題: python并發(fā)編程多進程 模擬搶票實現(xiàn)過程
本文地址: http://www.cppcns.com/jiaoben/python/268996.html
總結(jié)
以上是生活随笔為你收集整理的python模拟app抢票_python并发编程多进程 模拟抢票实现过程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ov5640帧率配置_赛博朋克2077
- 下一篇: AutoCAD .net 二次开发官方教