JavaScript はシングルスレッド (Web ワーカーと複数のプロセスの生成を除く) であり、スレッドをブロックするため、長時間実行される操作を待機しないことをお勧めします。それでも、Github のいくつかのモジュールを覗いてみると、実際にはこれらの同期操作が使用されており、ほとんどの場合はファイル操作で使用されています。
私は悪いコード/プラクティスを見つめていますか? それとも、私が気付いていない JavaScript で同期操作が本当に必要なのですか?
JavaScript はシングルスレッド (Web ワーカーと複数のプロセスの生成を除く) であり、スレッドをブロックするため、長時間実行される操作を待機しないことをお勧めします。それでも、Github のいくつかのモジュールを覗いてみると、実際にはこれらの同期操作が使用されており、ほとんどの場合はファイル操作で使用されています。
私は悪いコード/プラクティスを見つめていますか? それとも、私が気付いていない JavaScript で同期操作が本当に必要なのですか?
例を投稿できますか?あなたが見ている可能性が最も高いのは:
fs.read
。ノードコア API のすべての同期呼び出しは、 のように「同期」という単語で終わることに注意してくださいfs.readSync
。require('somemodule')
アプリケーションがネットワーク要求の受け入れを開始する前に実行されるような同期コードはい、HTTP 要求に応答しているときにコードが何かを実行しているのを見た場合fs.readSync
、それは悪いコード/慣行であり、その同期操作が行われている間、そのアプリケーションはロックされます。
Node.jsはシングルスレッドではなく、スレッドのプールを使用しますが、JavaScriptレイヤーにシングルスレッドとして公開されます。そうしないと、非同期コードを記述できなくなります。I / O呼び出しは、現在のスレッドをブロックします。
スレッドは、すべてのシステムコールの非同期性を偽造するために内部的に使用されます。libuvはまた、スレッドを使用して、スレッドを生成し、実行時に結果を収集することで、アプリケーションが実際にブロックしているタスクを非同期で実行できるようにします。
http://nikhilm.github.com/uvbook/threads.html
Node.jsは、他の一般的な言語との類似性を維持するために同期関数を含めることを決定しましたが、それらを使用するべきではありません。
Node.jsは本質的に非同期であり、純粋なjavascriptです。Javascriptは、クロージャ、コールバックの同義語です。Node.jsを使用して同期コードを記述したい場合は、Pythonなどの別のスクリプト言語を試してみてください。
ネストされたコールバックの苦痛を和らげる非同期と呼ばれる優れたモジュールがあります。では、なぜ同期コードを使用する必要があるのでしょうか。馬鹿な。同期コードを使用すると、Nodeが提供するすべての利点が失われます。唯一の例外はCLIアプリですが、ここでも、すべてのコードを非同期で記述したいと思います。それほど難しいことではありません。
あるレベルでは、同期操作が発生する必要があります。Node.js はそれらをスレッドに入れて、サーバー全体がブロックされないようにします。