python之路 併發程式設計之程序 互斥鎖

2021-08-27 05:14:41 字數 2975 閱讀 5949

互斥鎖

將多個任務對修改共享資料的操作由併發變為「序列」

沒有互斥鎖的情況下

# 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()

發現,兩張票被8個人購買

有互斥鎖的情況下

# 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模組的功能眾多 支援子程序 ...