最近、関数型言語についてよく読んでいます。それらは不変の構造のみを使用するため、同時実行性の問題が大幅に改善/解決されると主張しています。これが実際の状況で実際にどのように配信されるかを理解するのに深刻な問題があります。1 つのスレッドがポートをリッスンしている Web サーバーがあるとします (まあ、IO は頭を悩ませるもう 1 つの問題ですが、今は無視しましょう)。接続が試行されるたびに、ソケットが作成され、新しく作成されたスレッドに渡されます。スレッドはそれを処理し、受信した通信に応じて、サーバー アプリケーションにグローバルな大きなリスト/データ構造に変更を適用する場合があります。そう、
私の理解の問題は次のとおりです。
- 明らかに、どのスレッドでも、作業対象のリストの変更不可能な「スナップショット」を取得できます。ただし、変更が適用されたリストの新しいバージョンを作成して内容を「変更」した後でも、すべてのスレッドに独自のバージョンのリストが残っています。それらはどのようにマージされますか?
- 別の方法として、mutex/cond や go-like-channel などの従来のロック メカニズムを使用する方法があります。しかし、すべての変数が不変である場合、どのようにしてそのようなものを作成するのでしょうか?
- STMについて聞いたことがありますが、それは副作用に対処できません(つまり、リストがデータをファイルまたはデータベースに透過的にバックアップする場合)
では、そのようなことを関数型言語でどのようにモデル化しますか?