我聽說在Haskell,創建多線程應用程序是爲取一個標準的Haskell應用,並與-threaded
標誌編譯一樣容易。但是,其他情況在實際源代碼中描述了使用par
命令。Haskell多線程有多困難?
什麼是Haskell的多線程的狀態?引入程序有多簡單?是否有一個很好的多線程教程可以查看這些不同的命令及其用法?
我聽說在Haskell,創建多線程應用程序是爲取一個標準的Haskell應用,並與-threaded
標誌編譯一樣容易。但是,其他情況在實際源代碼中描述了使用par
命令。Haskell多線程有多困難?
什麼是Haskell的多線程的狀態?引入程序有多簡單?是否有一個很好的多線程教程可以查看這些不同的命令及其用法?
什麼是Haskell的多線程的狀態?
成熟。實施時間約爲15年,交易記憶爲5年。 GHC是一個廣泛使用的編譯器,具有大量的開源支持和商業支持。
引入程序有多簡單?
這取決於算法。有時可以使用par
來獲得並行性。有時需要開發新的算法。通常,在Haskell中引入安全並行和併發比在典型語言中更容易,並且性能很好。
是否有一個很好的多線程教程來說明這些不同的命令及其用法?
Haskell中有3個主要的並行和併發編程模型。
這些通過forkIO/MVars和軟件事務內存
par
這裏是an introduction to the main parallel programming models in Haskell,以及如何實現加速。
我認爲Chapter 24 of Real World Haskell是一個很好的教程。
還有併發項。
沒有在代碼中的任何改變你的哈斯克爾RTS將嘗試使用他們的一些內部流程,但在你的應用程序中使用,你應該給出正在通過par b (f a b)
做了提示,迫使哈斯克爾是對b
計算研究不是那麼懶,甚至如果f
將不需要它的結果。
對於每個需要其所有參數的函數(如a+b
),不要這樣做的原因之一是同步(調度計算和等待結果)會帶來一些開銷,並且您可能不希望花費額外的時間,僅僅因爲您可以並行計算乘法運算,因此需要輸入(2*3)+(3*4)
。而且你可能會丟失一些緩存命中或類似的東西,或者是在單處理器上完成時的優化(即無論如何都需要將結果從一個處理器傳遞到另一個處理器)。
當然,使用par
的代碼是醜陋的,當您使用光子元素摺疊列表或其他數據結構時,您可能需要計算一些光元素的塊,以確保開銷/計算將會真的很小。要解決這個問題,你可以看看parallel。
還有數據並行的Haskell(DPH)。
如果你的程序更多的是關於IO monad比你肯定需要很多改變。見forkIO
,Software Transactional Memory (STM)和許多其他人Concurrency category
我相信* Simon Marlow的Haskell *中的並行和並行編程通常被認爲是本主題的最佳介紹。 – 2017-02-13 18:53:26