19

Haskell の並行処理と並列処理のコンテキストにおける決定論をよく理解していません。いくつかの例が役に立ちます。ありがとう

4

2 に答える 2

25

並行性と並列性は 2 つの異なるものです。

同時実行性とは、複数のスレッドが非決定論的に相互作用することを意味します。たとえば、各クライアントが 1 つのスレッドによって処理されるチャット サーバーがあるとします。非決定性は、モデル化しようとしているシステムにとって不可欠です。

並列処理とは、複数のスレッドを使用してプログラムの実行を高速化することです。ただし、最終結果は、アルゴリズムを順次実行した場合とまったく同じになるはずです。

多くの言語には並列処理のプリミティブがないため、スレッドやロックなどの同時実行プリミティブを使用して実装する必要があります。ただし、これは、プログラマーが不必要な非決定性やその他の同時実行の問題を誤って導入しないように注意する必要があることを意味します。や のような明示的な並列処理のプリミティブを使用するparpseq、これらの問題の多くが解消されます。

于 2011-12-20T22:27:20.187 に答える
25

純粋な値を扱う場合、評価の順序は重要ではありません。それは本質的に並列処理が行うことです: 純粋な値を並列で評価します。純粋な値とは対照的に、順序は通常、副作用のあるアクションにとって重要です。アクションを同時に実行することを同時実行性と呼びます

例として、 と の 2 つのアクションputStr "foo"を考えてみましょうputStr "bar"。これら 2 つのアクションが評価される順序に応じて、出力は「foobar」、「barfoo」、またはその間の任意の状態になります。出力は特定の評価順序に依存するため、不確定です。

別の例として、 と の 2 つの値sum [1..10]を考えてみましょう5 * 3。これら 2 つが評価される順序に関係なく、常に同じ結果になります。この決定論は、通常、純粋な値でのみ保証できるものです。

于 2011-12-20T22:19:03.133 に答える