我需要在同一个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
答案 0 :(得分:3)
我找到了一个漂亮的"monad-parallel"库,用于非常相似的目的,以及一个更强大的分支 - "classy-parallel"。
要使monad可以以可并行化的方式使用,它需要有一个Parallel
类型类的实例。 “经典并行”库已经为最常用的类型提供了实例:ResourceT IO
和ReaderT
。
假设存在适当的实例,可以将相关代码转换为以下内容:
import qualified Control.Monad.Parallel as Parallel
main = runConnection connectionSettings $
Parallel.sequence [action1, action2, action3]
对于在ResourceT
中简单分叉,resourceForkIO
可能很有用。还有一个"monad-fork"库,可以在forkIO
和resourceForkIO
之上提供分叉的简洁概括。