haskell中的公平并发`map`函数?

Posted

技术标签:

【中文标题】haskell中的公平并发`map`函数?【英文标题】:Fair concurrent `map` function in haskell? 【发布时间】:2011-05-09 21:17:11 【问题描述】:

假设我正在模拟某种网络,并且有一个函数可以在 Chans 列表上广播一个值:

broadcast :: a -> [Receiver] -> IO ()
broadcast a = mapM_ (send a)

这会将数据按顺序“发送”到每个接收器。相反,我想向所有接收器进行非确定性广播。

感谢任何线索。

【问题讨论】:

【参考方案1】:

只使用 GHC 的并发怎么样?

broadcast :: a -> [Receiver] -> IO ()
broadcast a = mapM_ (forkIO . send a)

然后确保使用线程 RTS(使用 ghc -threaded 编译)。

【讨论】:

这引入了一些不确定性,当然,对于某些应用程序,我可以看到它是正确的方式。但我怀疑接收消息的顺序虽然不确定,但通常会非常接近线性顺序。如果你想确保事情是混淆的,最好明确地这样做。 也许在分叉每个线程后也会引入随机延迟?您的解决方案对于这种受限场景是有意义的,但我怀疑一旦您引入任何复杂性(例如沟通),它就不会一概而论。【参考方案2】:

http://hackage.haskell.org/package/random-shuffle-0.0.2

broadcast a rs = do 
   g <- newStdGen
   mapM_ (send a) $ shuffle' rs (length rs) g

【讨论】:

以上是关于haskell中的公平并发`map`函数?的主要内容,如果未能解决你的问题,请参考以下文章

Haskell 中的单子——洪峰老师讲创客道(三十五)

Haskell 示例中的函数组合

用sublime text 3编译haskell

FFI 可以处理数组吗?如果是这样,怎么做?

-bash: ghci: 找不到命令(Haskell 交互式 shell,Haskell 安装)

安全执行不受信任的 Haskell 代码