2013-01-04 65 views
4

我需要在同一個單元的上下文中運行多個併發進程,例如Connection。我期待像下面將工作:單線程中的多線程

main = runConnection connectionSettings $ do 
    forkIO action1 
    forkIO action2 
    action3 

forkIO需要在IO背景和動作來運行在IO了。

假設這些操作的類型爲:: Connection(),需要做些什麼來同時運行它們(實現哪些實例等)?

目前我解決此工作如下,但顯然這是不正確的:

main = do 
    forkIO $ runConnection connectionSettings action1 
    forkIO $ runConnection connectionSettings action2 
    runConnection connectionSettings action3 
+0

絕對不能保證它甚至可以以有意義的方式完成。然而,任何人都可以肯定地說什麼,你需要說出什麼是「連接」。 –

+1

你看過單子平行嗎? http://hackage.haskell.org/packages/archive/monad-parallel/0.7.1.1/doc/html/Control-Monad-Parallel.html –

+0

@ItaiZukerman謝謝!這看起來很有前途 –

回答

3

我發現一個美麗的"monad-parallel"庫意圖非常類似的目的,一個更強大的叉它 - "classy-parallel"

要使monad以可並行的方式使用,它需要有一個Parallel typeclass的實例。並且「優質並行」庫已經爲此類目的提供了最重要類型的實例:ResourceT IOReaderT

假設適當實例的存在有問題的代碼可被轉換到以下:

import qualified Control.Monad.Parallel as Parallel 

main = runConnection connectionSettings $ 
    Parallel.sequence [action1, action2, action3] 

對於ResourceTresourceForkIO簡單地分叉可以是有用的。還有一個"monad-fork"庫,該庫在forkIOresourceForkIO之上提供了一個分叉整齊而簡單的概括。