1. ホーム
  2. multithreading

[解決済み】Node.jsに対するHaskellの対応について教えてください。

2022-04-07 06:15:06

質問

ErlangコミュニティはNode.jsを羨ましく思っていないと思います。Node.jsはネイティブでノンブロッキングI/Oを行い、複数のプロセッサに簡単にデプロイする方法があります(Node.jsには組み込まれていないもの)。 詳しくは http://journal.dedasys.com/2010/04/29/erlang-vs-node-js および Node.jsまたはErlang

Haskellはどうでしょうか? HaskellはNode.jsの利点の一部、つまりマルチスレッドプログラミングに頼ることなくI/Oのブロッキングを回避するクリーンなソリューションを提供できるでしょうか?


Node.jsの魅力はたくさんあります。

  1. イベント スレッド操作なし、プログラマはコールバックのみを提供(Snapフレームワークと同様)。
  2. コールバックはシングルスレッドで実行されることが保証されており、レースコンディションが発生しない。
  3. UNIXフレンドリーのシンプルなAPI。 ボーナス:優れたHTTPサポート。DNSも利用可能です。
  4. すべてのI/Oは、デフォルトで非同期です。これにより、ロックの回避が容易になります。 しかし、コールバックでのCPU処理が多すぎると、他の接続に影響を与えます(この場合、タスクを小さなサブタスクに分割して再スケジューリングする必要があります)。
  5. クライアントサイドとサーバーサイドの言語が同じであること。(jQueryとNode.jsはイベントプログラミングモデルを共有していますが、それ以外は大きく異なっています。 サーバーサイドとクライアントサイドでコードを共有することが、実際にどのように役に立つのか、私には理解できない)
  6. これらをすべて1つの製品にパッケージしました。

解決するには?

OK、それでは node.jsのプレゼンテーション が教えてくれたように、Haskell と node.js を比較する方法についてもう少し説明できます。 プレゼンテーションの中で、RyanはGreen Threadsの利点のいくつかを説明していますが、その後、スレッドの抽象化がないことは欠点とは思わないと言い続けています。 私は、特にHaskellの文脈では、彼の立場には同意できない。スレッドが提供する抽象化は、サーバーコードをより簡単に正しく、より堅牢にするために不可欠なものだと思います。 特に

  • を処理するコードを書くのではなく、1つの接続に対して1つのスレッドを使用することで、1つのクライアントとの通信を表現するコードを書くことができます。 すべて のクライアントを同時に表示します。 このように考えてください。スレッドで複数のクライアントを処理するサーバは、単一のクライアントを処理するサーバとほとんど同じに見えます。 fork 前者のどこかに 実装するプロトコルが少しでも複雑だと、複数のクライアントのステートマシンを同時に管理するのはかなり厄介になる。一方、スレッドを使えば、単一のクライアントとの通信をスクリプト化するだけで済む。 一方、スレッドでは単一のクライアントとの通信をスクリプト化するだけなので、コードを正しく書くのも簡単だし、理解やメンテナンスもしやすい。

  • スレッドで実現するプリエンプティブなマルチタスクとは対照的に、1つのOSスレッドでコールバックを行うのは、協調的なマルチタスクと言えます。 協調型マルチタスクの主な欠点は、プログラマが飢餓状態にならないようにする責任があることです。 モジュール性が失われ、一カ所でミスをすると、システム全体がおかしくなってしまいます。 これは本当に心配したくないことで、先取りは簡単な解決策です。 さらに、コールバック間の通信は不可能です(デッドロックになります)。

  • Haskellでは、ほとんどのコードが純粋で、構造上スレッドセーフなので、並行処理は難しくありません。 単純な通信プリミティブがあります。 Haskellでは、無制限の副作用を持つ言語よりも、同時並行で自分の足を撃つのがずっと難しいのです。