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

为什么并发haskell是非确定性的,而并行haskell原语(par和pseq)是确定性的?,haskell,concurrency,parallel-processing,deterministic,non-deterministic,Haskell,Concurrency,Parallel Processing,Deterministic,Non Deterministic,我不太理解Haskell中并发和并行上下文中的决定论。一些例子会有帮助。 谢谢在处理纯值时,评估顺序并不重要。这基本上就是并行所做的:并行计算纯值。与纯粹的价值观相反,顺序通常对有副作用的行为很重要。同时运行操作称为并发 作为一个例子,考虑两个动作 PUSTR“FO”/COD>和 PUSTR“BAR”< /代码>。根据这两个操作的求值顺序,输出为“foobar”、“barfoo”或介于两者之间的任何状态。输出是不确定的,因为它取决于具体的评估顺序 < P>作为另一个例子,考虑两个值求和(1…10

我不太理解Haskell中并发和并行上下文中的决定论。一些例子会有帮助。
谢谢

在处理纯值时,评估顺序并不重要。这基本上就是并行所做的:并行计算纯值。与纯粹的价值观相反,顺序通常对有副作用的行为很重要。同时运行操作称为并发

作为一个例子,考虑两个动作<代码> PUSTR“FO”/COD>和<代码> PUSTR“BAR”< /代码>。根据这两个操作的求值顺序,输出为“foobar”、“barfoo”或介于两者之间的任何状态。输出是不确定的,因为它取决于具体的评估顺序


< P>作为另一个例子,考虑两个值<代码>求和(1…10)< /代码>和<代码> 5×3 < /代码>。无论这两种方法的评估顺序如何,它们都会得到相同的结果。这种决定论通常只能用纯价值来保证

并发和并行是两件不同的事情

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

并行性是指使用多个线程来简单地使程序运行得更快。但是,最终结果应该与按顺序运行算法完全相同


许多语言没有用于并行的原语,因此必须使用线程和锁等并发原语来实现它。然而,这意味着程序员必须小心,以确保不会意外地引入不必要的非确定性或其他并发问题。使用显式并行原语,如
par
pseq
,这些问题中的许多都会消失。

+1;换句话说,并行性是一种优化;并发更改语义。在lang oz中:1数据流值只能绑定一次2程序使用解除绑定值应等待绑定。因此,当两个线程使用相同的数据流值时,行为是确定的。