2009-06-05 40 views
46

我對「火花」的概念感到困惑什麼是Haskell中的「火花」

它是Haskell中的線程嗎?或者是產生新線程的行爲?

謝謝大家:

所以總結一下,火花不是線程,但更多的計算單元(任務,把它在C#/ Java術語)。所以這是Haskell實現任務並行的方式。

回答

32

參見A Gentle Introduction to Glasgow Parallel Haskell.

並行在GPH由par組合子,這兩個參數是在平行於被評估引入。表達式p `par` e(這裏我們使用Haskell的中綴運算符表示)具有與e相同的值,並且在其第一個參數中不是嚴格的,即bottom `par` e具有值e。 (bottom表示無終止或失敗的計算)。其動態行爲是指示p可以由新的並行線程評估,其中父線程繼續評估e。我們說p已經引發,並且隨後可以創建一個線程來評估它,如果處理器空閒的話。由於線程不一定是創建的,因此p類似於懶惰的未來

[在原始強調]

+1

當我讀到它時,「火花」並不是一個線程,因爲它是一個可以在線程中運行的計算。運行時可能對旋轉和評估火花的線程有固定的上限。 – ephemient 2009-06-06 00:08:10

+1

這是不正確的。火花不是線程。 GHC支持火花,這是在隊列,Haskell(輕量級線程)和OS線程中未經評估的計算。 – 2011-05-01 17:16:50

87

火花不是線程。 forkIO引入了Haskell線程(映射到更少的實際OS線程)。 Sparks爲每個線程在工作隊列中創建條目,如果線程變得空閒,它們將從中執行要執行的任務。因此,火花很便宜(您可能在程序中擁有數十億,而您可能不會有超過一百萬個Haskell線程,並且在六個內核上的操作系統線程不到十幾個)。

把它看成是這樣的:

spark model

+0

你有沒有從這裏獲取圖片:http://expcodes.com/125624?某些歸因可能很好。 – 2013-05-11 06:06:31

3

如果我理解正確的話,火花是在需要工作的工作隊列的條目。線程池從這個隊列中獲取條目並運行它們。通常每個物理處理器都有一個線程,因此該方案可最大化吞吐量並最小化線程上下文切換。

0

看起來它與英特爾線程構建模塊中的「任務」類似。