44 併發程式設計 資料共享

2022-04-29 12:30:08 字數 2570 閱讀 1111

一、引入

展望未來,基於訊息傳遞的併發程式設計是大勢所趨;即便是使用執行緒,推薦做法也是將程式設計為大量獨立的執行緒集合。通過訊息佇列交換資料。這樣極大地減少了對使用鎖定和其他同步手段的需求,還可以擴充套件到分布式系統中。

程序間應該盡量避免通訊,即便需要通訊,也應該選擇程序安全的工具來避免加鎖帶來的問題,應該盡量避免使用本節所講的共享資料的方式,以後我們會嘗試使用資料庫來解決程序之間的資料共享問題。

二、manager模組 - 實現資料共享

1、定義

程序間資料是獨立的,可以借助於佇列或管道實現通訊,二者都是基於訊息傳遞的;雖然程序間資料獨立,但可以通過manager實現資料共享,事實上manager的功能遠不止於此。

多程序共同去處理共享資料的時候,就和我們多程序同時去操作乙個檔案中的資料是一樣的,不加鎖就會出現錯誤的結果,程序不安全的,所以也需要加鎖

1 a manager object returned by manager() controls a server process which holds python objects and

allows other processes to manipulate them using proxies.

23 a manager returned by manager() will support types list, dict, namespace, lock, rlock, semaphore, boundedsemaphore, condition, event, barrier, queue, value and array.

官方解釋

1

from multiprocessing import

process,manager23

deffunc(m_dic):

4 m_dic['

name

'] = '

alex_luffy'#

子程序對資料進行了修改56

if__name__ == '

__main__':

7 m =manager()

8 m_dic = m.dict()

9print('

主程序', m_dic) #

先記錄一下原始資料是啥樣的

10 p = process(target=func,args=(m_dic,)) #

將字典資料傳遞給子程序

11p.start()

12 p.join() #

先讓子程序執行完畢

1314

print('

主程序'

,m_dic)

15結果:

16 主程序

17 主程序 - m_dic內的資料被子程序修改了

view code

2、建立多程序取修改子程序的資料(會出現資料不安全->會導致資料混亂加鎖解決)

1

#設定乙個100數字,建立20個程序,分別去減一23

from multiprocessing import

process,manager,lock45

deffunc(m_dic,ml):6#

不加鎖的情況會出現資料錯亂7#

m_dic['count'] -= 189

#加鎖,這是另外一種加鎖形式

10with ml:

11 m_dic['

count

'] -= 1

1213#等同

14#ml.acquire()15#

m_dic['count'] -= 116#

ml.release()

1718

if__name__ == '

__main__':

19 m =manager()

20 ml =lock()

21 m_dic = m.dict()22#

print('主程序', m_dic)

23 p_list =

2425

#開啟20個程序來對共享資料進行修改

26for i in range(20):

27 p1 = process(target=func,args=(m_dic,ml,))

28p1.start()

2930 [ppp.join() for ppp in

p_list]

3132

print('

主程序',m_dic)

解決資料不安全

3、總結

下面要講的訊號量和事件也相當於鎖,也是全域性的,所有程序都能拿到這些鎖的狀態,程序之間這些鎖啊訊號量啊事件啊等等的通訊,其實底層還是socekt,只不過是基於檔案的socket通訊,而不是跟上面的資料共享啊空間共享啊之類的機制,我們之前學的是基於網路的socket通訊,還記得socket的兩個家族嗎,乙個檔案的乙個網路的,所以將來如果說這些鎖之類的報錯,可能你看到的就是類似於socket的錯誤,簡單知道一下就可以啦~~~

python 併發程式設計 資料共享

1.資料共享 實現程序之間的資料共享 from multiprocessing import manager,process class mypro process def init self,dic super init self.dic dic defrun self self.dic coun...

併發程式設計 3 執行緒間共享資料

一 共享記憶體帶來的問題 讀時沒問題,寫時會有競爭問題。二 解決方法 1 最簡單的辦法就是對資料結構採用某種保護機制,確保只有進行修改的執行緒才能看到不變數被破壞時的中間狀態。從其他訪問執行緒的角度來看,修改不是已經完成了,就是還沒開始。2 另乙個選擇是對資料結構和不變數的設計進行修改,修改完的結構...

八 併發程式設計 程序資料之間共享

一 manager程序資料之間資料共享 1.資料之間共享概念 展望未來,基於訊息傳遞的併發程式設計是大勢所趨 即便是使用執行緒,推薦做法也是將程式設計為大量獨立的執行緒集合,通過訊息佇列交換資料。這樣極大地減少了對使用鎖定和其他同步手段的需求,還可以擴充套件到分布式系統中。但程序間應該盡量避免通訊,...