日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

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

發布時間:2023/12/18 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python模拟app抢票_python并发编程多进程 模拟抢票实现过程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

搶票是并發執行

多個進程可以訪問同一個文件

多個進程共享同一文件,我們可以把文件當數據庫,用多個進程模擬多個人執行搶票任務

db.txt

{"count": 1}

并發運行,效率高,但競爭寫同一文件,數據寫入錯亂,只有一張票,都賣成功給了10個人

#文件db.txt的內容為:{"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) # 模擬讀數據的網絡延遲

print("用戶 查看剩余票數為 [%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(" 購票成功" % 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]

用戶 查看剩余票數為 [1]

用戶 查看剩余票數為 [1]

用戶 查看剩余票數為 [1]

用戶 查看剩余票數為 [1]

用戶 查看剩余票數為 [1]

用戶 查看剩余票數為 [1]

用戶 查看剩余票數為 [1]

用戶 查看剩余票數為 [1]

購票成功

剩余票數為 [0]

購票成功

剩余票數為 [0]

購票成功

剩余票數為 [0]

購票成功

剩余票數為 [0]

購票成功

剩余票數為 [0]

購票成功

剩余票數為 [0]

購票成功

剩余票數為 [0]

購票成功

剩余票數為 [0]

購票成功

剩余票數為 [0]

購票成功

剩余票數為 [0]

總結程序出現數據寫入錯亂

加鎖處理:購票行為由并發變成了串行,犧牲了運行效率,但保證了數據安全

購票功能不應該并發執行,查票應該是并發執行的

查票準不準確不重要,有可能這張票就被別人買走

一個人寫完以后,讓另外一個人基于上一個人寫的結果,再做購票操作

#把文件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]" % (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(" 購票成功" % 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()

執行結果

用戶 查看剩余票數為 [1]

用戶 查看剩余票數為 [1]

用戶 查看剩余票數為 [1]

用戶 查看剩余票數為 [1]

用戶 查看剩余票數為 [1]

用戶 查看剩余票數為 [1]

用戶 查看剩余票數為 [1]

用戶 查看剩余票數為 [1]

用戶 查看剩余票數為 [1]

用戶 查看剩余票數為 [1]

購票成功

剩余票數為 [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]" % (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(" 購票成功" % 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()

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持我們。

本文標題: python并發編程多進程 模擬搶票實現過程

本文地址: http://www.cppcns.com/jiaoben/python/268996.html

總結

以上是生活随笔為你收集整理的python模拟app抢票_python并发编程多进程 模拟抢票实现过程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。