我对“火花”的概念感到困惑
它是Haskell中的一个主题吗?或者是产生新线程的行为?
谢谢大家:
总而言之,spark不是线程,而是更多的计算单元(将它放在C#/ Java术语中的任务)。所以这是实现任务并行性的Haskell方式。
答案 0 :(得分:91)
Sparks不是线程。 forkIO
引入了Haskell线程(映射到较少的实际OS线程)。 Sparks在每个线程的工作队列中创建条目,如果线程空闲,它们将从中执行任务。
因此,火花很便宜(你可能在程序中有数十亿个,而你可能不会有超过一百万个Haskell线程,而且在六个核心上只有不到十几个OS线程)。 / p>
这样想:
答案 1 :(得分:32)
请参阅A Gentle Introduction to Glasgow Parallel Haskell.
par
组合器在GPH中引入了并行性,它采用两个并行求值的参数。表达式p `par` e
(这里我们使用Haskell的中缀运算符表示法)与e
具有相同的值,并且在其第一个参数中不严格,即bottom `par` e
的值为{{1} }。 (e
表示非终止或失败的计算。)其动态行为是指示bottom
可由新并行线程评估,父线程继续评估p
。我们说e
已被引发,并且随后可以创建一个线程来评估处理器是否处于空闲状态。由于不一定要创建线程,p
类似于懒惰的未来。
[原文强调]
答案 2 :(得分:3)
如果我理解正确,火花就是需要工作的工作队列中的一个条目。线程池从此队列中获取条目并运行它们。通常每个物理处理器有一个线程,因此该方案可以最大化吞吐量并最小化线程上下文切换。
答案 3 :(得分:0)
它看起来类似于英特尔线程构建模块中的“任务”。