搶票小程式

2022-05-15 01:14:04 字數 2630 閱讀 1471

目錄

#db.txt

--------------------------------

from multiprocessing import process

import json,time,os

def search():

time.sleep(1) # 模擬網路io

with open('db.txt',mode='rt',encoding='utf-8') as f:

res = json.load(f)

print(f'還剩')

def get():

with open('db.txt',mode='rt',encoding='utf-8') as f:

res = json.load(f)

# print(f'還剩')

time.sleep(1) # 模擬網路io

if res['count'] > 0:

res['count'] -= 1

with open('db.txt',mode='wt',encoding='utf-8') as f:

json.dump(res,f)

print(f'程序 搶票成功')

time.sleep(1.5) # 模擬網路io

else:

print('票已經售空啦!!!!!!!!!!!')

def task():

search()

get()

if __name__ == '__main__':

for i in range(15):

p = process(target=task)

p.start()

---------------------------------------------

併發執行效率高,但競爭寫同乙個檔案,資料寫入錯亂,只有一張票,卻成功賣給多個人

於是進行加鎖處理

#db.txt

--------------------------------

from multiprocessing import process,lock

import json,time,os

def search():

time.sleep(1) # 模擬網路io

with open('db.txt',mode='rt',encoding='utf-8') as f:

res = json.load(f)

print(f'還剩')

def get():

with open('db.txt',mode='rt',encoding='utf-8') as f:

res = json.load(f)

# print(f'還剩')

time.sleep(1) # 模擬網路io

if res['count'] > 0:

res['count'] -= 1

with open('db.txt',mode='wt',encoding='utf-8') as f:

json.dump(res,f)

print(f'程序 搶票成功')

time.sleep(1.5) # 模擬網路io

else:

print('票已經售空啦!!!!!!!!!!!')

def task(lock):

search()

# 鎖住

lock.acquire()

get()

lock.release()

# 釋放鎖頭

if __name__ == '__main__':

lock = lock() # 寫在主程序是為了讓子程序拿到同一把鎖.

for i in range(15):

p = process(target=task,args=(lock,))

p.start()

購票行為由併發變成了序列,犧牲了執行效率,但保證了資料安全,那為什麼不用join將併發改成 序列?

答:使用join將併發改成序列,確實可以保證資料的安全,但就變成查票操作也就變成了只能乙個乙個人去查了,很明顯大家查票是併發的去查詢而無需資料準確與否,此時join和互斥鎖的區別就顯而易見了,join是將乙個任務 整體序列,而互斥鎖的好處就是可以將乙個任務的某個**序列,比如只讓task函式中的get任務序列

#加鎖可以保證多個程序修改同一塊資料時,同一時間只能有乙個任務可以進行修改,即序列的修改,沒錯,速度是慢了,但犧牲了速度卻保證了資料安全。

雖然可以用檔案共享資料實現程序間通訊,但問題是:

1.效率低(共享資料基於檔案,而檔案是硬碟上的資料)

2.需要自己加鎖處理

#因此我們最好找尋一種解決方案能夠兼顧:1、效率高(多個程序共享一塊記憶體的資料)2、幫我們處理好鎖問題。這就是mutiprocessing模組為我們提供的基於訊息的ipc通訊機制:佇列和管道。

1 佇列和管道都是將資料存放於記憶體中

2 佇列又是基於(管道+鎖)實現的,可以讓我們從複雜的鎖問題中解脫出來,

我們應該盡量避免使用共享資料,盡可能使用訊息傳遞和佇列,避免處理複雜的同步和鎖問題,而且在程序數目增多時,往往可以獲得更好的可獲展性。

多執行緒搶票 搶票軟體變身「黃牛」 想要票 多交錢

如今,使用搶票軟體的人越來越多,曾經免費的搶票軟體們紛紛推出vip或加速包,要想票,就必須多交錢,搶票軟體搖身一變成了線上 黃牛 由於地區距離和運營商線路的原因,12306出票的伺服器可能會有很大的延遲,搶票軟體能通過伺服器來發起購票要求,延遲更低,搶的更快。除了反應時間和網路延遲的差別,搶票軟體甚...

模擬搶票系統

from multiprocessing import process,lock import json,time,random,os def piao mutex mutex.acquire 作用 按順序購票,不會插隊 dic json.load open db.txt 讀取,檢視車票總數 if ...

12306搶票軟體

import json,time 讀寫資料庫中的票數 defwr info sign,dic none if sign r with open ticket mode r encoding utf 8 as fp dic json.load fp return dic elif sign w wit...