2016-03-20 15 views
1

ほとんどのNodeJSプログラマは、NodeJSのシングルスレッドイベントループをブロックするのが悪いことを知っています。たとえば、ファイルを読むときは、fs.readFileSyncの代わりにfs.readFileを使用するほうがよいことがわかっています。私の質問は、APIによって実行される基本的なタスクが本質的に同期している場合、最初にasyn APIを作成するにはどうすればいいですか?別の言葉では、fs.readFileSyncなどのAPIを作成し、イベントループスレッドを使用して基本のタスクを実行する方法はありますか?これを行うにはNodeJS & Javascriptの外に出なければなりませんか?nodeJS(またはブラウザ)用の非同期APIの作成

答えて

1

APIによって実行される 基本タスクが本質的に同期している場合、最初にasyn APIを作成する方法はありますか? (例えばfs.readFile()など)は、既存の非同期操作の

  1. ベースにそれを:Node.jsの中

、独自の非同期操作を作成するための次の選択肢があります。主な操作自体が同期していて、node.jsで同期的にしか実行できない場合、このオプションは明らかに問題を解決しません。

  • setTimeout()setImmediate()、またはnextTick()を使用してコードを小さな塊に分割し、他のものがあなたの操作とインターリーブし、他のものがCPUを共有するのをブロックしないようにします。これはCPUの使用を妨げるものではありませんが、他の操作とCPUの共有を可能にします。ここでは、他の操作がCPUを共有することをブロックしないチャンク内の配列を反復する例を示します:Best way to iterate over an array without blocking the UI
  • 同期操作を、別のプロセス(別のnode.jsプロセスまたは他のプロセス)に移動し、適切なプロセス間通信メカニズム(TCP、stdioなど)を使用して非同期で通信します。 )。
  • ネイティブOSスレッドまたはネイティブIOイベントを使用できるようにnode.jsプラグインを作成し、非同期インターフェイスを持つnode.jsで新しい操作を作成できます。

  • は、私がこれを行うにはNodeJS & JavaScriptを外に行く必要がありますか?

    上記の項目#1、#2、#3はすべてJavascriptから行うことができます。項目#4には、ネイティブコードプラグイン(ネイティブスレッドへのアクセス権を持つことができる)の作成が含まれます。私は本当にゼロからfs.readFileSync()のようなAPIを作成するにはfs.readFileSync

    など として

    をAPIの作成に取り掛かるか、あなたはオプション#3のいずれかを使用する必要がありますどのように別の単語は、(やる

    他のプロセスでは非同期で結果を返す)またはオプション#4(ネイティブコードプラグインを介してnode.jsに組み込まれているよりも低いレベルでOSサービスにアクセスする)

    +0

    1が利用できない場合、最も効率的です。 NodeJSを他の言語で書かれたモジュールと統合する最良の方法は何ですか?私は財務計算を行ういくつかのマルチスレッドJavaモジュールを持っています。私は、これらのモジュールをTCP/IPサーバにパッケージングし、NodeJSアプリケーションがTCP経由でサーバにアクセスすることを考えていました。それが最善の方法だと思いますか? – ptmoy2

    +0

    @ ptmoy2 - これらのモジュールをTCP/IPサーバーにパッケージングすることは確かにその1つの方法です。インターフェイス全体が簡単に理解できるTCP/IPであるため実装するのはきれいです。私たちが議論し始めていなくても、最終的にはいくつかのベンチマークを必要とするであろうことが、「最良の」ものに依存するということは、選択肢の中で「最良の」方法が何であるかを評価することは、決定する特定のシナリオの – jfriend00

    +0

    @ ptmoy2 - クエリを「別のTCPサーバーに置いて、それをTCPを介して許容可能なソリューションにアクセスしています」に変更する場合、その答えは通常「はい」です。 – jfriend00

    関連する問題