目錄
#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...