我听说在Haskell,创建多线程应用程序是为取一个标准的Haskell应用,并与-threaded
标志编译一样容易。但是,其他情况在实际源代码中描述了使用par
命令。Haskell多线程有多困难?
什么是Haskell的多线程的状态?引入程序有多简单?是否有一个很好的多线程教程可以查看这些不同的命令及其用法?
我听说在Haskell,创建多线程应用程序是为取一个标准的Haskell应用,并与-threaded
标志编译一样容易。但是,其他情况在实际源代码中描述了使用par
命令。Haskell多线程有多困难?
什么是Haskell的多线程的状态?引入程序有多简单?是否有一个很好的多线程教程可以查看这些不同的命令及其用法?
什么是Haskell的多线程的状态?
成熟。实施时间约为15年,交易记忆为5年。 GHC是一个广泛使用的编译器,具有大量的开源支持和商业支持。
引入程序有多简单?
这取决于算法。有时可以使用par
来获得并行性。有时需要开发新的算法。通常,在Haskell中引入安全并行和并发比在典型语言中更容易,并且性能很好。
是否有一个很好的多线程教程来说明这些不同的命令及其用法?
Haskell中有3个主要的并行和并发编程模型。
这些通过forkIO/MVars和软件事务内存
par
这里是an introduction to the main parallel programming models in Haskell,以及如何实现加速。
我认为Chapter 24 of Real World Haskell是一个很好的教程。
还有并发项。
没有在代码中的任何改变你的哈斯克尔RTS将尝试使用他们的一些内部流程,但在你的应用程序中使用,你应该给出正在通过par b (f a b)
做了提示,迫使哈斯克尔是对b
计算研究不是那么懒,甚至如果f
将不需要它的结果。
对于每个需要其所有参数的函数(如a+b
),不要这样做的原因之一是同步(调度计算和等待结果)会带来一些开销,并且您可能不希望花费额外的时间,仅仅因为您可以并行计算乘法运算,因此需要输入(2*3)+(3*4)
。而且你可能会丢失一些缓存命中或类似的东西,或者是在单处理器上完成时的优化(即无论如何都需要将结果从一个处理器传递到另一个处理器)。
当然,使用par
的代码是丑陋的,当您使用光子元素折叠列表或其他数据结构时,您可能需要计算一些光元素的块,以确保开销/计算将会真的很小。要解决这个问题,你可以看看parallel。
还有数据并行的Haskell(DPH)。
如果你的程序更多的是关于IO monad比你肯定需要很多改变。见forkIO
,Software Transactional Memory (STM)和许多其他人Concurrency category
我相信* Simon Marlow的Haskell *中的并行和并行编程通常被认为是本主题的最佳介绍。 – 2017-02-13 18:53:26