2009-06-05 36 views
46

我对“火花”的概念感到困惑什么是Haskell中的“火花”

它是Haskell中的线程吗?或者是产生新线程的行为?

谢谢大家:

所以总结一下,火花不是线程,但更多的计算单元(任务,把它在C#/ Java术语)。所以这是Haskell实现任务并行的方式。

回答

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

当我读到它时,“火花”并不是一个线程,因为它是一个可以在线程中运行的计算。运行时可能对旋转和评估火花的线程有固定的上限。 – ephemient 2009-06-06 00:08:10

+1

这是不正确的。火花不是线程。 GHC支持火花,这是在队列,Haskell(轻量级线程)和OS线程中未经评估的计算。 – 2011-05-01 17:16:50

87

火花不是线程。 forkIO引入了Haskell线程(映射到更少的实际OS线程)。 Sparks为每个线程在工作队列中创建条目,如果线程变得空闲,它们将从中执行要执行的任务。因此,火花很便宜(您可能在程序中拥有数十亿,而您可能不会有超过一百万个Haskell线程,并且在六个内核上的操作系统线程不到十几个)。

把它看成是这样的:

spark model

+0

你有没有从这里获取图片:http://expcodes.com/125624?某些归因可能很好。 – 2013-05-11 06:06:31

3

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

0

看起来它与英特尔线程构建模块中的“任务”类似。