【问题标题】:Why is concurrent haskell non deterministic while parallel haskell primitives (par and pseq) deterministic?为什么并发haskell是不确定的,而并行haskell原语(par和pseq)是确定的?
【发布时间】:2012-01-24 20:06:06
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • +1;换句话说,并行性是一种优化;并发改变语义。
    • 在 lang oz 中:1 数据流值只能绑定一次 2 程序使用取消绑定值应该等到它被绑定。因此,当两个线程使用一个相同的数据流值时,行为是确定的。
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 并发不必涉及多个线程,事件循环可用于在单线程环境中提供并发(JavaScript 就是一个例子)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-09
    相关资源
    最近更新 更多