Haskell中的并发编程

问题描述 投票:3回答:1

与Java / Scala相比,Haskell中并发编程的两个(相关)问题:

  1. Haskeller用于并发数据结构的是什么?是否有类似于Java的java.util.concurrent.{ConcurrentHashMap, ConcurrentSkipListSet, ..}MVar (Map k v)不算:)。共享的可变状态是邪恶的,但偶尔也是必要的。
  2. 有没有相当于Java的ExecutorService? AFAIK,Haskell线程(参见fork#中的yield#GHC.Exts等)都是由RTS内置的东西安排的。但是如果我特意想要使用fork连接池,或者在线程池上安排一些计算呢?能够将Future放在特定的执行上下文中对Scala来说非常方便,我不知道如何在Haskell中做到这一点。
haskell concurrency jvm ghc
1个回答
3
投票

关于这个主题可以写完整本书,所以我会尝试触及你所询问的要点。

  • 您可以使用par组合器来安排在未来某个时间点完成的纯计算。 RTS已经为此实现了工作窃取队列,并且已经为每个CPU核心维护一个线程来运行它们。 (如果您将程序与相应的开关链接起来。)请注意,这对于不纯的代码无效,并且不允许您指定代码执行的线程或核心。
  • 对于共享可变存储,您有两种选择。 使用MVar显式锁定。这具有锁定其他编程语言的所有常见缺陷。 (死锁,忘记锁定东西,锁定太多东西,锁定东西太久,没有锁定它们足够长的时间......)所以MVar (Map k v)绝对有意义! STM。你似乎误解了它的作用。 STM的重点是你不需要锁。它允许您使用共享可变数据结构“好像”它们不共享,但它会自动防止数据争用,不一致状态以及不使用锁的所有其他常见问题。它还允许线程同时在多个条件下等待。这是一个令人难以置信的框架!
  • 如果你想在特定的OS线程上运行代码,你可能正在寻找forkOS而不是forkIO

鉴于您的用例,我怀疑STM可能正是您正在寻找的。如果您正在尝试执行特定任务,请发布另一个问题,您可能会获得更具体的建议。

© www.soinside.com 2019 - 2024. All rights reserved.