一、引入
展望未來,基於訊息傳遞的併發程式設計是大勢所趨;即便是使用執行緒,推薦做法也是將程式設計為大量獨立的執行緒集合。通過訊息佇列交換資料。這樣極大地減少了對使用鎖定和其他同步手段的需求,還可以擴充套件到分布式系統中。
程序間應該盡量避免通訊,即便需要通訊,也應該選擇程序安全的工具來避免加鎖帶來的問題,應該盡量避免使用本節所講的共享資料的方式,以後我們會嘗試使用資料庫來解決程序之間的資料共享問題。
二、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.
1view codefrom 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內的資料被子程序修改了
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.資料之間共享概念 展望未來,基於訊息傳遞的併發程式設計是大勢所趨 即便是使用執行緒,推薦做法也是將程式設計為大量獨立的執行緒集合,通過訊息佇列交換資料。這樣極大地減少了對使用鎖定和其他同步手段的需求,還可以擴充套件到分布式系統中。但程序間應該盡量避免通訊,...