什么是Haskell中的“火花”

我对“火花”的概念感到困惑,

这是Haskell中的一个线程吗? 或者是产生新线程的行为?

谢谢大家:

所以总结一下,sparks不是线程,而是更多的计算单位(任务放在C#/ Java中)。 所以这是Haskell实现任务并行的方式。

请参阅“格拉斯哥并行Haskell简介”。

并行性在GPH中由par组合子引入,它需要两个要并行评估的参数。 expression式(这里我们使用Haskell的中缀操作符)与e具有相同的值,并且在其第一个参数中不是严格的,即bottom `par` e的值为e 。 ( bottom表示一个非终止或失败的计算。)它的dynamic行为是指示p可以由一个新的并行线程来评估,并且父线程继续评估e 。 我们说p已经被引发 ,并且随后可以创build一个线程来评估它,如果处理器空闲的话。 由于线程不一定是创build的, p类似于懒惰的未来

[强调原创]

火花不是线程。 forkIO引入了Haskell线程(映射到更less的实际操作系统线程)。 Sparks会在每个线程的工作队列中创build条目,如果线程空闲,它们将从中执行要执行的任务。

因此,火花很便宜(程序中可能有数十亿个,而你可能不会有超过一百万个Haskell线程,并且在六个内核上有不到十几个OS线程)。

像这样想:

火花模型

如果我理解正确,火花就是进入需要工作的一系列工作中的一个入口。 线程池从这个队列中获取条目并运行它们。 通常每个物理处理器有一个线程,所以这个scheme最大化了吞吐量并且最小化了线程上下文切换。

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