Python並行(parallel)之談

簡介

能夠先看看併發Concurrent與並行Parallel的區別算法

在談並行前,頭腦中總會浮出多線程、多進程、線程/進程同步、線程/進程通訊等詞語。編程

那爲何須要同步、通訊,它們之間的做用是怎樣的呢?設計模式

通訊,稍微好理解,就是多線程/進程之間相互通話,好比我打電話呼叫你,我說什麼,你答什麼,或者我說,你只聽。它着重於數據的傳遞多線程

同步,實際上是相對於共享內存而言,好比,咱們在同一時刻同一個地方修改了共享對象的數據,這樣就會致使數據的篡改,得不到理想中的結果,這時就須要同步。它的基礎是基於共享同一個對象而言。併發

 

如今軟件世界中,存在着不少模式和框架,好比設計模式,MVC框架,那麼並行編程是否也存在某些模式呢?app

經常使用的四種並行模式框架

  1. 共享內存模式(The shared memory model
  2. 多線程模式(The multithread model
  3. 分佈式內存/消息傳遞模式(The distributed memory/message passing model
  4. 數據並行模式(The data parallel model

如今咱們再來看看線程/進程同步,它們是否是基於共享內存模式;線程/進程通訊對應着消息傳遞模式。分佈式

說明一點:數據並行,是將數據分割成多組相互獨立的數據處理。性能

設計併發程序的四個階段(PCAM設計方法學)ui

  1. 劃分(Partitioning:分解成小的任務,開拓併發性
  2. 通信(Communication):肯定諸任務間的數據交換,監測劃分的合理性;
  3. 組合(Agglomeration):依據任務的局部性,組合成更大的任務;
  4. 映射(Mapping):將每一個任務分配處處理器上,提升算法的性能。

案例演示

該案例,採用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》

二、並行算法的通常設計過程

相關文章
相關標籤/搜索