我对“Spark”的概念感到困惑。
它是Haskell中的线程吗?还是产生新线程的操作?
谢谢大家:
总之,火花(spark)不是线程,而更像计算单元(任务,在C#/Java术语中)。因此,这是Haskell实现任务并行的方式。
我对“Spark”的概念感到困惑。
它是Haskell中的线程吗?还是产生新线程的操作?
谢谢大家:
总之,火花(spark)不是线程,而更像计算单元(任务,在C#/Java术语中)。因此,这是Haskell实现任务并行的方式。
forkIO
引入了Haskell线程(它们映射到较少的真实操作系统线程)。“火花”为每个线程在工作队列中创建条目,如果线程变为空闲状态,则从该队列中获取任务执行。par
组合器引入并行性,它接受两个将被并行求值的参数。表达式p `par` e
(这里使用Haskell中的中缀运算符表示)与e
具有相同的值,并且对其第一个参数不强制求值,即bottom `par` e
的值为e
。(bottom
表示非终止或失败的计算。)它的动态行为是指出p
可以由新的并行线程进行求值,而父线程则继续求值e
。我们说p
已经被启动,如果处理器空闲,随后可能创建一个线程来评估它。由于不一定会创建线程,因此p
类似于延迟的未来。如果我理解正确,闪火是需要工作的作业队列中的一条记录。线程池从该队列中获取条目并运行它们。通常每个物理处理器有一个线程,因此这种方案可以最大限度地提高吞吐量并最小化线程上下文切换。
看起来它类似于Intel Threading Building Blocks中的“任务”。
-threaded
,那么火花和forkIO
调用会发生什么?换句话说,主线程是它自己的“Haskell轻量级线程”吗? - CMCDragonkai