Python並行(parallel)之談,python並行parallel

來源:互聯網
上載者:User

Python並行(parallel)之談,python並行parallel
簡介

可以先看看並發Concurrent與並行Parallel的區別

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

那為什麼需要同步、通訊,它們之間的作用是怎樣的呢?

通訊,稍微好理解,就是多線程/進程之間相互連話,比如我打撥打電話你,我說什麼,你答什麼,或者我說,你只聽。它著重於資料的傳遞

同步,其實是相對於共用記憶體而言,比如,我們在同一時刻同一個地方修改了共用對象的資料,這樣就會導致資料的篡改,得不到理想中的結果,這時就需要同步。它的基礎是基於共用同一個對象而言。

 

現在軟體世界中,存在著很多模式和架構,比如設計模式,MVC架構,那麼並行編程是否也存在某些模式呢?

常用的四種並行模式

現在我們再來看看線程/進程同步,它們是不是基於共用記憶體模式;線程/進程通訊對應著訊息傳遞模式。

說明一點:資料並行,是將資料分割成多組相互獨立的資料處理。

設計並發程式的四個階段(PCAM設計方法學):

案例示範

該案例,採用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             break14         lock.acquire()15         share_value.value = share_value.value + data16         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 = 041     for i in range(num):42         result = result + i43     print("result should be " + str(result))44     print("fact is " + str(share_value.value))

 

輸出結果:

result should be 49995000

fact is 49995000

 

 

 

 

 

 

參考:

1、《Python Parallel Programming Cookbook》

2、並行演算法的一般設計過程

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.