monad中的多线程

时间:2013-01-04 05:48:01

标签: multithreading haskell concurrency

我需要在同一个monad的上下文中运行多个并发进程,比如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

1 个答案:

答案 0 :(得分:3)

我找到了一个漂亮的"monad-parallel"库,用于非常相似的目的,以及一个更强大的分支 - "classy-parallel"

要使monad可以以可并行化的方式使用,它需要有一个Parallel类型类的实例。 “经典并行”库已经为最常用的类型提供了实例:ResourceT IOReaderT

假设存在适当的实例,可以将相关代码转换为以下内容:

import qualified Control.Monad.Parallel as Parallel

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

对于在ResourceT中简单分叉,resourceForkIO可能很有用。还有一个"monad-fork"库,可以在forkIOresourceForkIO之上提供分叉的简洁概括。