互斥鎖將多個任務對修改共享資料的操作由併發變為「序列」
沒有互斥鎖的情況下發現,兩張票被8個人購買# json檔案
# 執行檔案
import os
import time
import json
import random
from multiprocessing import process
def check():
with open("a.json","r",encoding="utf-8") as f:
data_dic = json.load(f)
time.sleep(random.random())
print('[%s] 在%s 檢視了車票,車票還剩:%s' %
(os.getpid(), time.strftime('%y-%m-%d %x'), data_dic['count']))
def pay():
with open("a.json","r",encoding="utf-8") as f:
data_dic = json.load(f)
time.sleep(random.random())
if data_dic['count'] > 0:
data_dic['count'] -= 1
time.sleep(random.random())
with open("a.json","w",encoding="utf-8") as f:
json.dump(data_dic,f)
print('[%s] 在%s 購買了車票' % (os.getpid(), time.strftime('%y-%m-%d %x')))
else:
print('[%s] 在%s 購票失敗' % (os.getpid(), time.strftime('%y-%m-%d %x')))
def buy_tickets():
check()
pay()
if __name__ == '__main__':
for i in range(8):
p = process(target=buy_tickets)
p.start()
有互斥鎖的情況下# json 檔案
# 執行檔案
import os
import time
import json
import random
from multiprocessing import process, lock
def check():
with open("a.json", "r", encoding="utf-8") as f:
data_dic = json.load(f)
time.sleep(random.random())
print('[%s] 在%s 檢視了車票,車票還剩:%s' %
(os.getpid(), time.strftime('%y-%m-%d %x'), data_dic['count']))
def pay():
with open("a.json", "r", encoding="utf-8") as f:
data_dic = json.load(f)
time.sleep(random.random())
if data_dic['count'] > 0:
data_dic['count'] -= 1
time.sleep(random.random())
with open("a.json", "w", encoding="utf-8") as f:
json.dump(data_dic, f)
print('[%s] 在%s 購買了車票' % (os.getpid(), time.strftime('%y-%m-%d %x')))
else:
print('[%s] 在%s 購票失敗' % (os.getpid(), time.strftime('%y-%m-%d %x')))
def buy_tickets(lock):
# 如果將鎖加到這裡,就將整個任務序列了
check()
lock.acquire() # 該程序拿到鎖,其餘沒有鎖的程序等待
pay()
lock.release() # 釋放鎖,其餘等待程序競爭
'''或者使用with上下文管理
with lock:
pay()
'''if __name__ == '__main__':
mutex = lock() # 獲得鎖物件
for i in range(8):
p = process(target=buy_tickets, args=(mutex,))
# p = process(target=buy_tickets, kwargs=)
p.start()
總結1.多個任務併發的去操作共享資料會造成資料錯亂,使用互斥鎖,雖然使任務對共享資料的操作由併發變為「序列」,減低了效率,但是提高了資料的安全性
2.此方法的共享資料效率低(資料來自於硬碟) 並且需要自己去處理鎖的問題
所以,為了解決第二個問題,就要尋求一種方法---->使多個程序共享乙個記憶體空間中的共享資料,該方法可以替我們處理好鎖的問題
ipc通訊
管道與佇列
管道與佇列將資料存放於記憶體中,而且佇列是通過管道+鎖實現的
python之路 併發程式設計之程序 IPC
ipc 程序間的通訊 兩種實現方式 管道 pipe 佇列 queue 其實就是pipe lock 注意 兩者實際上都是記憶體空間,不要往裡面放入大資料,只能放資料量較小的訊息 ipc所解決的問題 1.當多個任務併發的去修改共享資料,就可能會造成資料錯亂,我們通過加互斥鎖使多個任務對共享資料的操作由併...
Python併發程式設計之程序池
前言 本博文主要講解python併發程式設計中的程序池 pool python多程序中的multiprocessing python多程序中的fork python程序通訊之queue 當我們需要建立的子程序數量不多時,可以直接利用multiprocessing中的process動態成生多個程序,但...
併發程式設計之程序
在python中大部分情況需要使用多程序。python提供了multiprocessing。multiprocessing模組用來開啟子程序,並在子程序中執行我們定製的任務 比如函式 該模組與多執行緒模組threading的程式設計介面類似。multiprocessing模組的功能眾多 支援子程序 ...