2017-03-28 3 views
0

私はnodejsの初心者です。 私のプログラムでは、長時間の非同期を解決する必要があります。 は、私は私のコードを試してみました:長い作業非同期nodejsを作る

function testAsync(callback){ 
    //do long-work 
    for(var i=0;i<1000000000;i++){ 
     //do-nothing, just pseudo a long work 
    } 
    //callback 
    callback(); 
} 
testAsync(function(){ 
    console.log("test"); 
}); 
console.log('main'); 

しかし、私はtestAsyncを実行している、「テスト」は常にそれが長い仕事を同期走る意味し、「メイン」の前に印刷します。 したがって、非同期で長時間作業を実行するにはどうすればよいですか?

EDIT

https://www.dropbox.com/s/32b0nwwr6r0x2zk/jsonschemavalidator.js?dl=0

私は、クライアントの要求からの入力を検証するためにvalidateAndConvert関数を作成しました。私はそれが非同期に実行されることを望むが、それは同期的に実行されるようだ。

+2

あなただけの同期コードを非同期に「作る」していない - それはそもそも非同期操作である必要があります。たとえば、forループはCPUにバインドされているため、非同期ではほとんど実行できません。非同期にしようとしている*実際のコードは何ですか? –

+0

はい@AntP。このコードは本質的に同期しています。 –

+0

@AntP私のコードはhttps://www.dropbox.com/s/32b0nwwr6r0x2zk/jsonschemavalidator.js?dl=0 –

答えて

2

どのように私は非同期で長い作業を実行するのですか?

あなたはスケジュール作業が非同期でスタートすることができますが、それは、後に開始だとき、それはまだスレッドだけノードをタイアップされますが上のJavaScriptコードを実行します。つまり、スレッドをただちにブロックするのではなく、後でブロックするだけです。同期作業は同期作業です。

それはあなたが何をしたいのかではないと仮定すると、あなたは、主に2つの選択肢があります:

  1. を使用すると、他の操作ができるようにしているので、小さな断片に作業を分割し、非同期的に各部分をスケジュールしますそれらの作品を扱うことに散在しています。

  2. child processに作業をオフロードします。

+0

私は編集しました私の質問、私の実際のコードをアップロードします。私のコードを見直して助言をいただけますか? –

+0

@MinhGiang:申し訳ありませんが、あなたの質問の完全な内容はリンクされていない**あなたの質問に**なければなりません。リンクは腐って、質問とその答えが将来の人々に使用されます。別に、人々はあなたを助けるためにオフサイトに行くべきではありません。 –

+0

しかし、コードは長すぎます。便利ではありません。 –

1

メインアプリケーションからこの長時間実行されるタスクを削除することを検討しましたか?良いデザインは、このタスク(PDF生成、画像処理など)を完全に分離した別のノードアプリ、ワーカーを作成することです。 2つのアプリケーション間の通信はキューで行われます。

この方法で、アプリの規模をさらに拡大することもできます。

SOAとmicroservicesについての素晴らしい記事は:https://blog.risingstack.com/why-you-should-start-using-microservices/

関連する問題