19

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

4

2 回答 2

25

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

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

作为另一个例子,考虑两个值sum [1..10]5 * 3。无论这两个被评估的顺序如何,它们总是减少到相同的结果。这种确定性通常只能用纯值来保证。

于 2011-12-20T22:19:03.133 回答
25

并发和并行是两个不同的东西。

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

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

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

于 2011-12-20T22:27:20.187 回答