4

我需要在同一个 monad 的上下文中运行多个并发进程,例如Connection. 我希望像下面这样的东西会起作用:

main = runConnection connectionSettings $ do
  forkIO action1
  forkIO action2
  action3

forkIO需要在IO上下文中运行,并且也需要在其中执行操作IO

假设这些动作有一个 type :: Connection (),需要做什么来同时运行它们(要实现哪些实例等等)?

目前我正在解决这个问题,但显然这是不对的:

main = do
  forkIO $ runConnection connectionSettings action1
  forkIO $ runConnection connectionSettings action2
  runConnection connectionSettings action3
4

1 回答 1

3

我发现了一个用于非常相似目的的漂亮的“monad-parallel” 库,以及一个更强大的分支—— “classy-parallel”

为了使 monad 以可并行化的方式可用,它需要有一个类型类的实例Parallel。并且“classy-parallel”库已经为此目的提供了最重要类型的实例:ResourceT IOReaderT.

假设存在适当的实例,有问题的代码可以转换为以下内容:

import qualified Control.Monad.Parallel as Parallel

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

ResourceT因为简单地分叉resourceForkIO可能很有用。还有一个“monad-fork”forkIO库,它提供了一个简洁的概括,而不是在和之上的分叉resourceForkIO

于 2013-01-24T18:56:38.590 回答