与Java / Scala相比,Haskell中并发编程的两个(相关)问题:
java.util.concurrent.{ConcurrentHashMap, ConcurrentSkipListSet, ..}
。 MVar (Map k v)
不算:)。共享的可变状态是邪恶的,但偶尔也是必要的。ExecutorService
? AFAIK,Haskell线程(参见fork#
中的yield#
,GHC.Exts
等)都是由RTS内置的东西安排的。但是如果我特意想要使用fork连接池,或者在线程池上安排一些计算呢?能够将Future
放在特定的执行上下文中对Scala来说非常方便,我不知道如何在Haskell中做到这一点。关于这个主题可以写完整本书,所以我会尝试触及你所询问的要点。
par
组合器来安排在未来某个时间点完成的纯计算。 RTS已经为此实现了工作窃取队列,并且已经为每个CPU核心维护一个线程来运行它们。 (如果您将程序与相应的开关链接起来。)请注意,这对于不纯的代码无效,并且不允许您指定代码执行的线程或核心。MVar
显式锁定。这具有锁定其他编程语言的所有常见缺陷。 (死锁,忘记锁定东西,锁定太多东西,锁定东西太久,没有锁定它们足够长的时间......)所以MVar (Map k v)
绝对有意义!
STM。你似乎误解了它的作用。 STM的重点是你不需要锁。它允许您使用共享可变数据结构“好像”它们不共享,但它会自动防止数据争用,不一致状态以及不使用锁的所有其他常见问题。它还允许线程同时在多个条件下等待。这是一个令人难以置信的框架!forkOS
而不是forkIO
。鉴于您的用例,我怀疑STM可能正是您正在寻找的。如果您正在尝试执行特定任务,请发布另一个问题,您可能会获得更具体的建议。