什么是Haskell中的“spark”?

51

我对“Spark”的概念感到困惑。

它是Haskell中的线程吗?还是产生新线程的操作?

谢谢大家:

总之,火花(spark)不是线程,而更像计算单元(任务,在C#/Java术语中)。因此,这是Haskell实现任务并行的方式。

4个回答

94
火花不是线程。 forkIO 引入了Haskell线程(它们映射到较少的真实操作系统线程)。“火花”为每个线程在工作队列中创建条目,如果线程变为空闲状态,则从该队列中获取任务执行。
因此,“火花”非常便宜(您可能会在程序中有数十亿个“火花”,而您可能不会有超过一百万个Haskell线程,以及少于半打核心上不到十二个操作系统线程)。
可以这样考虑:

spark model


1
你从这里获取了图片吗:http://expcodes.com/125624?适当的归属标注会更好。 - Sebastian Mach
53
@phresnel,这是我原创的作品,专门为这个问题使用Inkscape制作。你的链接实际上未经归属地使用了我的作品-您可以通过查看内容的日期来确定。请注明出处。 - Don Stewart
6
我明白了,我主要是想知道链接内容为什么似乎具有更高的分辨率。没看日期是我的失误,感谢澄清 :) - Sebastian Mach
如果没有编译 -threaded,那么火花和 forkIO 调用会发生什么?换句话说,主线程是它自己的“Haskell轻量级线程”吗? - CMCDragonkai

32
参见《A Gentle Introduction to Glasgow Parallel Haskell》,GPH中通过par组合器引入并行性,它接受两个将被并行求值的参数。表达式p `par` e(这里使用Haskell中的中缀运算符表示)与e具有相同的值,并且对其第一个参数不强制求值,即bottom `par` e的值为e。(bottom表示非终止或失败的计算。)它的动态行为是指出p可以由新的并行线程进行求值,而父线程则继续求值e。我们说p已经被启动,如果处理器空闲,随后可能创建一个线程来评估它。由于不一定会创建线程,因此p类似于延迟的未来

1
据我所了解,"Spark" 不仅仅是一个线程,而是可以在线程中运行的计算。运行时可能会对线程设置一个固定的上限,这些线程会轮流评估计算任务。 - ephemient
1
这不正确。Sparks 不是线程。GHC 支持 Sparks,它们是队列中未评估的计算,还有 Haskell(轻量级线程)和操作系统线程。 - Don Stewart

3

如果我理解正确,闪火是需要工作的作业队列中的一条记录。线程池从该队列中获取条目并运行它们。通常每个物理处理器有一个线程,因此这种方案可以最大限度地提高吞吐量并最小化线程上下文切换。


1

看起来它类似于Intel Threading Building Blocks中的“任务”。


3
我想给一个+1,但感觉还需要更多的内容才能成为一个答案,现在更像是一条评论。添加一些链接,并讨论这些概念如何相似,重点是帮助我们理解Sparks。 - derekv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接