能夠先看看併發Concurrent與並行Parallel的區別算法
在談並行前,頭腦中總會浮出多線程、多進程、線程/進程同步、線程/進程通訊等詞語。編程
那爲何須要同步、通訊,它們之間的做用是怎樣的呢?設計模式
通訊,稍微好理解,就是多線程/進程之間相互通話,好比我打電話呼叫你,我說什麼,你答什麼,或者我說,你只聽。它着重於數據的傳遞多線程
同步,實際上是相對於共享內存而言,好比,咱們在同一時刻同一個地方修改了共享對象的數據,這樣就會致使數據的篡改,得不到理想中的結果,這時就須要同步。它的基礎是基於共享同一個對象而言。併發
如今軟件世界中,存在着不少模式和框架,好比設計模式,MVC框架,那麼並行編程是否也存在某些模式呢?app
經常使用的四種並行模式框架
如今咱們再來看看線程/進程同步,它們是否是基於共享內存模式;線程/進程通訊對應着消息傳遞模式。分佈式
說明一點:數據並行,是將數據分割成多組相互獨立的數據處理。性能
設計併發程序的四個階段(PCAM設計方法學):ui
該案例,採用Python多進程實現。進程間通訊在官網的例子叫作Exchanging objects between processes,進程同步在官網的例子叫作Synchronization between processes 以及 Sharing state between processes。
設計併發程序。
首先,任務分解:1個進程專門存儲數據,多個進程取數據並進行計算。
其次,進程通訊:採起queue隊列供存取進程通訊。
最後,組合:多個進程計算後的數據,怎麼組合在一塊兒呢?採起多進程的共享內存數據Value,若是是多個進程對共享數據操做,則需進行同步。
1 import multiprocessing 2 3 def make_data(queue, num, work_nums): 4 for i in range(num): 5 queue.put(i) 6 for i in range(work_nums): 7 queue.put(None) 8 9 def handle_data(queue, share_value, lock): 10 while True: 11 data = queue.get() 12 if data is None: 13 break 14 lock.acquire() 15 share_value.value = share_value.value + data 16 lock.release() 17 18 if __name__ == "__main__": 19 queue = multiprocessing.Queue() # 進程間通訊所用 20 share_value = multiprocessing.Value("i", 0) # 進程間共享所用 21 lock = multiprocessing.Lock() # 進程間共享內存時,採用鎖同步機制 22 num = 10000 # 23 work_nums = 5 # work進程個數 24 sub_process = [] # 處理數據進程集合 25 26 master_process = multiprocessing.Process(target=make_data, args=(queue, num, work_nums, )) # 生成數據進程 27 for i in range(work_nums): 28 sub_process1 = multiprocessing.Process(target=handle_data, args=(queue, share_value, lock,)) 29 sub_process.append(sub_process1) 30 31 master_process.start() 32 for p in sub_process: 33 p.start() 34 35 master_process.join() 36 for p in sub_process: 37 p.join() 38 39 # 結果對比 40 result = 0 41 for i in range(num): 42 result = result + i 43 print("result should be " + str(result)) 44 print("fact is " + str(share_value.value))
輸出結果:
result should be 49995000
fact is 49995000
參考:
一、《Python Parallel Programming Cookbook》