gpt4 book ai didi

haskell - Haskell 中的并发编程

转载 作者:行者123 更新时间:2023-12-04 01:26:22 24 4
gpt4 key购买 nike

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

  • Haskeller 对并发数据结构有什么用?有没有类似于 Java 的 java.util.concurrent.{ConcurrentHashMap, ConcurrentSkipListSet, ..} . MVar (Map k v)不算数 :)。共享可变状态是邪恶的,但有时是必要的。
  • 是否有任何等效于 Java 的 ExecutorService ? AFAIK,Haskell 线程(参见 fork#yield#GHC.Exts )都是由 RTS 中内置的东西调度的。但是如果我特别想使用 fork 连接池,或者在线程池上安排一些计算呢?可以放Future 's on specific execution contexts 在 Scala 中真的很方便,我不知道如何在 Haskell 中做到这一点。
  • 最佳答案

    关于这个主题可以写一整本书,所以我将尝试仅触及您所询问的要点。

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

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

    关于haskell - Haskell 中的并发编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55909755/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com