为什么并发haskell非确定性而并行haskell原语(par和pseq)确定性?

时间:2011-12-20 22:04:23

标签: haskell concurrency parallel-processing deterministic non-deterministic

不太了解Haskell中并发性和并行性的上下文中的确定性。一些例子会有所帮助。 感谢

2 个答案:

答案 0 :(得分:25)

在处理纯值时,评估顺序无关紧要。这基本上是 parallelism 所做的:并行评估纯值。与纯值相反,顺序通常对具有副作用的行为很重要。同时运行操作称为并发

例如,请考虑两个操作putStr "foo"putStr "bar"。根据评估这两个动作的顺序,输出可以是“foobar”,“barfoo”或其间的任何状态。输出是不确定,因为它取决于具体的评估顺序。

作为另一个示例,请考虑两个值sum [1..10]5 * 3。无论评估这两者的顺序如何,它们总是会减少到相同的结果。这个决定论是你通常只能用纯值保证的东西。

答案 1 :(得分:24)

并发和并行是两回事。

并发意味着您有多个线程以非确定性方式进行交互。例如,您可能有一个聊天服务器,其中每个客户端由一个线程处理。非决定论对于您尝试建模的系统至关重要。

并行性是指使用多个线程简化程序运行速度。但是,最终结果应该与顺序运行算法完全相同。

许多语言都不具有并行性的原语,因此您必须使用并发原语(如线程和锁)来实现它。但是,这意味着程序员必须小心确保不会意外地引入不需要的非确定性或其他并发问题。使用显式并行原语如parpseq,其中许多问题都会消失。