最近私は関数型言語について多くのことを読んできました。これらは不変構造のみを使用するため、並行性の問題が大幅に改善/解決されていると主張しています。私はこれが実際の状況でどのように実際に提供されるのかを深刻に理解しています。 1つのスレッドがポートでリッスンしているWebサーバーがあるとしましょう(IOは別のものですが、私の頭をラップするのは難しいですが、今は無視してみましょう)。接続の試行時に、ソケットが作成され、新しく作成されたスレッドに渡されます。新しく作成されたスレッドは、受信した通信に応じて、サーバーアプリケーションのグローバルな大きなリスト/データ構造に変更を適用します。したがって、リストの一貫性のあるビューを持つすべてのスレッド(または少なくとも、スレッドが正しい方法で終了するとすぐにリストに適用された1つのスレッドによって行われたすべての変更を行うために) ?不変型および永続型およびデータ構造を使用する並行性はどのように機能しますか?
私の問題の理解は以下のとおりです。
- 明らかに任意のスレッドが動作するように、リストの変更不可能な「スナップショット」を取得することができます。しかし、変更を適用して新しいバージョンのリストを作成して内容を変更した後も、すべてのスレッドには独自のバージョンのリストが残っています。それらはどのように合併されていますか?
- 別の方法としては、mutex/condやgo-like-channelなどの従来のロックメカニズムを使用する方法があります。しかし、すべての変数が不変であるときに、どのようにしてそのようなことを作成しますか?
- 私はSTMについて聞いた(リストには、ファイルやDBへの透過的にバックアップデータかどうIE)
は、どのようにあなたがそのようなことをモデル化するだろう、しかし、副作用に対処することができません関数型言語?
ここでは、基本的な概念についての良い話です。http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey – buritos
すでに2回見ましたが、残念ながら、まだそれを取得していません。関数型プログラミングの最大の問題は、1)ほとんどの人が命令型言語を学び訓練していること2)関数型言語は別の方法で考える必要があること3)関数型プログラミングを教えるリソースがないこと99%(= )信じられないほど単純な例を除いて – Askaga
それは私も同様に来ているとそれは簡単ではないですね。私は、スレッドが他のスレッドの副作用を読み取る必要がある理由に答えることから始めます。私はちょうど私の旅を始めたと私はなぜ私は答えをしようとしないだろうと思う、私は確信している人の多くはこれにも答えます:-) – buritos