【发布时间】:2012-01-24 20:06:06
【问题描述】:
不太了解 Haskell 中并发和并行上下文中的确定性。一些例子会有所帮助。 谢谢
【问题讨论】:
标签: haskell concurrency parallel-processing deterministic non-deterministic
不太了解 Haskell 中并发和并行上下文中的确定性。一些例子会有所帮助。 谢谢
【问题讨论】:
标签: haskell concurrency parallel-processing deterministic non-deterministic
在处理纯值时,评估顺序无关紧要。 parallelism 本质上就是这样做的:并行评估纯值。与纯值相反,顺序通常对具有副作用的操作很重要。同时运行动作称为并发。
例如,考虑putStr "foo" 和putStr "bar" 这两个操作。根据评估这两个操作的顺序,输出是“foobar”、“barfoo”或介于两者之间的任何状态。输出是不确定的,因为它取决于具体的评估顺序。
再举一个例子,考虑sum [1..10] 和5 * 3 这两个值。无论这两个被评估的顺序如何,它们总是减少到相同的结果。这种确定性通常只能用纯值来保证。
【讨论】:
并发和并行是两个不同的东西。
并发意味着您有多个线程进行非确定性交互。例如,您可能有一个聊天服务器,其中每个客户端都由一个线程处理。非确定性对于您尝试建模的系统至关重要。
并行性是关于使用多个线程来简单地使您的程序运行得更快。但是,最终结果应该与按顺序运行算法完全相同。
许多语言没有并行原语,因此您必须使用并发原语(如线程和锁)来实现它。但是,这意味着您的程序员必须小心,以确保您不会意外引入不需要的非确定性或其他并发问题。使用像 par 和 pseq 这样的显式并行原语,这些顾虑中的许多问题都会消失。
【讨论】: