2016-04-17 14 views
1

ファイルを最初にロードし、後でそれを非同期的に処理する非同期関数を想像してみましょう。関数は、ファイルを使用せずに続けることができないので、私の仮定は、このファイルをロードすると、同期的に行うことができることである(*):別のファイルに対して複数回呼び出すことができ同期関数の非同期関数への影響

const asyncFnWithSyncCode(filePath, next) { 

    // Load file 
    const file = fs.readFileSync(filePath) 

    // Continue to process file with async functions 
    // ... 

    next(null, processedFile) 

} 

asyncFnWithSyncCode

async.parallel([ 
    (done) => { asyncFnWithSyncCode('a.json', done) }, 
    (done) => { asyncFnWithSyncCode('b.json', done) }, 
    (done) => { asyncFnWithSyncCode('c.json', done) } 
], next) 

私の質問は:これはパフォーマンスにどのような影響を及ぼしますか?同期機能によって他のreadFileSyncが遅れますか?それはまったく影響がありますか?

ベストプラクティス、リソース、意見を歓迎します。ありがとう!

(*)私は単純に非同期readFile -versionを使用することができますが、この特殊な構成でどのように動作するのか本当に知りたいと思います。

答えて

1

同期機能によって、もう一方のreadFileSyncsの遅延が発生しますか?

はい。 NodeJSは、イベントループ(ジョブキュー)を使用して単一スレッド上のすべてのJavaScriptコードを実行します。これは、非同期システムコールを使用する理由の1つが同期イベントより強力に推奨されています。

readFileは読み取り操作をスケジュールし、I/Oレイヤーがデータが入るのを待っている間にJavaScriptスレッドで他の処理を実行させます。ノードのI/Oレイヤーは、データが利用可能なときにJavaScriptスレッドのタスクをキューに入れます。これが最終的にreadFileコールバックを呼び出します。

対照的に、readFileSyncは、その1つのJavaScriptスレッドを保持し、ファイルデータが使用可能になるのを待っています。スレッドが1つしかないので、その他のものを保持します他の場合はreadFileSync呼び出しを含むコードが実行されている可能性があります。

あなたのコードはreadFileSyncを使用する必要はありません(ほとんど行いません)。 readFileのコールバックを使用してください:

const asyncFnWithSyncCode(filePath, next) { 

    // Load file 
    fs.readFile(filePath, function(err, file) { 
     if (err) { 
      // ...handle error... 
      // ...continue if appropriate: 
      next(err, null); 
     } else { 
      // ...use `file`... 

      // Continue to process file with async functions 
      // ... 
      next(null, processedFile); 
     } 
    }); 
} 
+0

非常によく説明されています。どうもありがとう! – tobi

関連する問題