Haskell 多线程有多难?

Posted

技术标签:

【中文标题】Haskell 多线程有多难?【英文标题】:How difficult is Haskell multi-threading? 【发布时间】:2011-03-01 23:58:35 【问题描述】:

我听说在 Haskell 中,创建多线程应用程序就像使用标准 Haskell 应用程序并使用 -threaded 标志编译它一样简单。然而,其他案例描述了在实际源代码中使用par 命令。

Haskell 多线程的状态如何?引入程序有多容易?是否有一个很好的多线程教程来介绍这些不同的命令及其用途?

【问题讨论】:

我相信 Simon Marlow 的 Parallel and Concurrent Programming in Haskell 通常被认为是对该主题的最佳介绍。 【参考方案1】:

Haskell 多线程的状态如何?

成熟。该实现大约有 15 年的历史,具有 5 年的事务内存。 GHC 是一种广泛使用的编译器,拥有大量的开源支持和商业支持。

引入程序有多容易?

这取决于算法。有时它可以单行使用par 来获得并行性。有时必须开发新的算法。一般来说,在 Haskell 中引入安全的并行性和并发性会比在典型语言中更容易,而且性能也不错。

是否有一个很好的多线程教程来介绍这些不同的命令及其用途?

Haskell 中有 3 种主要的并行和并发编程模型。

通过par 隐式并行 通过 forkIO / MVars 和软件事务内存显式并发和并行 通过 DPH 库实现数据并行

这些是主要的事情。在所有情况下,您都使用 -threaded 进行编译以使用多核运行时,但并行化特定问题的难易程度取决于您使用的算法以及您从该列表中采用的并行编程模型。

这里是an introduction to the main parallel programming models in Haskell, 以及如何实现加速。

我认为Chapter 24 of Real World Haskell 是一个很好的教程。

【讨论】:

【参考方案2】:

还有并发项。

在没有任何代码更改的情况下,您的 haskell rts 将尝试将它们用于某些内部进程,但要在您的应用程序中使用,您应该给出一个由 par b (f a b) 完成的提示,这迫使 Haskell 在计算 @ 时不要那么懒惰987654326@ 即使f 不需要它作为结果。

不对每个需要其所有参数的函数(如a+b)执行此操作的原因之一是同步(调度计算和等待结果)会产生一些开销,您可能不想花额外的钱- 标记(2*3)+(3*4) 只是因为您可以并行计算乘法。而且您可能会丢失一些缓存命中或类似的东西,或者当您在单个处理器上执行此操作时完成的优化(即,无论如何您都需要将结果从一个处理器传递到另一个处理器)。

当然,使用par 的代码很丑陋,当您折叠列表或其他带有轻量子元素的数据结构时,您可能需要计算一些轻量元素块以确保开销/计算将真的很小。要解决这个问题,您可以查看parallel。

还有数据并行 Haskell (DPH)。

如果您的程序更多地是关于 IO monad,那么您肯定需要进行许多更改。请参阅forkIO、Software Transactional Memory (STM) 以及来自Concurrency category 的许多其他人

【讨论】:

以上是关于Haskell 多线程有多难?的主要内容,如果未能解决你的问题,请参考以下文章

Haskell - 基于 Actor 的可变性

Haskell 中的半显式并行

多线程和多进程模式有啥区别

c++ 多线程与c多线程有啥区别?

什么是多线程,多进程?

多线程