javascript 言語には、 node.jsのようなプロジェクトの成功に貢献するノンブロッキング IO の実装を支援する特性があることを読みました。私の質問は、これらの特性は何であり、非ブロッキング IO を他の言語で実装するのが難しいのはなぜですか?
4 に答える
JavaScript がノンブロッキング IO としてラベル付けされることがある理由は、匿名で定義された (イベント ベースの) 関数の概念のためです。Node.js は、javascript が優れたサーバー側言語である理由として、これを明確にラベル付けしています。ただし、技術的にノンブロッキングではないため、これは半分の真実にすぎませんが、匿名コールバック/ajax 関数からのコールバックを待機している間もコードを実行し続けます。これがあなたが読んだものかどうかはわかりませんが、ある Node チュートリアルで提供されている説明は次のとおりです。
「もう 1 つの方法は、Node や、Nginx や Thin などの非常に高速な最新のサーバーで採用されているもので、イベント ループで単一のノンブロッキング スレッドを使用することです。これは、JavaScript を使用するという決定が本当に輝く場所です。シングル スレッド イベント ループ ベースの環境で使用するように設計されています: ブラウザ. クロージャを渡す JavaScript の機能により、イベント ベースのプログラミングが非常に簡単になります. 基本的には、関数を呼び出して何らかのタイプの I/O を実行し、それにコールバックを渡すだけです.関数と JavaScript は自動的にクロージャーを作成し、呼び出し元の関数がスコープ外になってから長い間、正しい状態が保持されるようにします。」
ソース: http://net.tutsplus.com/tutorials/javascript-ajax/this-time-youll-learn-node-js/
マルチスレッドタグに関して、Node.jsとJavascriptはマルチスレッドではありません.コールバックを待っている間、クロージャのシステムを使用して状態を保持します。したがって、完全に非ブロッキングではありません。ブロッキングが発生するシナリオはたくさんありますが、ほとんどの小規模な実装では、開発者がブロッキング状況に遭遇することはありません。
node.js が悪い理由については、こちらを参照してください: http://teddziuba.com/2011/10/node-js-is-cancer.html (リンク切れ)
そして反論のためにここに:http://rhyolight.posterous.com/nodejs-is-not-cancer (リンク切れ)
非同期関数は通常、JavaScript ではイベントベースです。これは、コールバック ハンドラーを登録することを意味します。コードは登録後に実行されますが、イベントを待機しません。イベントの後に実行されることはすべて、ハンドラーから呼び出される必要があります。それがすべてだと思います。
もちろん、ブラウザのwindow.alert
/ confirm
/のように例外もあります。prompt
https://youtu.be/dFnkZ15-_0o?t=2125 Andrew Mead の node.js コースからのこの抜粋は、JS における非ブロッキング I/O 操作とブロッキング I/O 操作の違いを視覚的に説明する素晴らしい仕事をしています。クリップは 35:25 ~ 47:16 です。