什么是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模块中的“任务”类似。