2013-10-30 31 views
0

我有幾個有關以下代碼片段功能的問題。關於用於python並行的python Pool.map函數的澄清

def f(x): 
    return x*x 

if __name__ == '__main__': 
    pool = Pool(processes=10)    # start 10 worker processes 
    result = pool.apply_async(f, [10]) # evaluate "f(10)" asynchronously 
    print result.get(timeout=1)   
    print pool.map(f, range(10))   # prints "[0, 1, 4,..., 81]" 
  1. 在線路pool = Pool(processes=10),它甚至有所作爲,如果我在4處理器架構(四核)運行,並且由於僅多達4個進程可以執行實例化超過4個的工作進程在任何時間點?

  2. pool.map(f,range(10))函數中,如果我實例化10個工作進程,並且可能有50個映射器,python在完成執行時負責分配映射到進程,或者我應該計算出有多少映射器被創建並實例化行pool = Pool(processes=number_of_mappers)?許多進程。

這是我第一次嘗試對任何事情進行並行處理,而且我感到非常困惑。所以任何幫助將不勝感激。

提前致謝!

+0

在您做出了設計使其在單臺計算機上高效運行的優秀設計選擇後,您意識到某些問題對於單臺計算機來說太大了。添加進程使您能夠針對特定問題拋出硬件。 – Back2Basics

回答

2
  1. 如果您創建比你有可用的CPU更多的工作進程,這很好,但過程會互相進行循環競爭。也就是說,您將浪費更多的週期,因爲致力於在進程之間切換的週期並沒有讓您接近完成。對於CPU限制的任務,這只是浪費。但是,對於I/O綁定的任務,它可能正是您想要的,因爲在這種情況下,進程將花費大量空閒時間,等待阻止I/O完成。

  2. map函數自動切片他們的迭代參數並將其片段發送到所有工作進程。不過,我真的不知道mappers是什麼意思。你認爲你在你的例子中創建了多少個mappers? 10? 1?還有別的嗎?在您寫下的內容中,pool.map()會阻止所有工作完成。

+0

我認爲它創建了10個映射器,每個值爲0-9。 – anonuser0428

+0

然後將「映射器」從你的心智模型中取出;-)這個短語並不真正對應於發生的任何事情。 'map()'「的實現只是」分割迭代器並將元素傳遞給儘可能多的工作進程。在你的例子中'range(1000000)'也可以正常工作 - 如果你使用可選的'chunksize'參數,雖然會運行得更快。 –

+0

好吧,在我的例子中,讓我們說範圍(10)被範圍(100)替換,說map函數會創建函數'f'的100個「實例」,每個實例都帶有列表0中的一個值-99。對於100個實例中的每一個,「池」一次將10個實例一次傳遞給工作線程。由於只有10個工作線程?我只是想在我的應用程序中實現這個功能之前,確保我完全理解這裏發生了什麼。 – anonuser0428

1
  1. 你可以比你的CPU可以執行的線程數量創造更多的工人。這在實時應用程序(如Web服務器)中是必需的,您必須確保每個客戶端都能與您通信而無需等待其他應用程序。如果它不是實時應用程序,並且您只想儘快完成所有工作,那麼創建與CPU同時處理的線程數將更爲明智。

  2. 無論您有多少工作,Python都會爲工作人員分配工作。