2016-11-03 20 views
2

asyncコールが実際に非同期的に実行されている場合、私は疑問に思う、次の出力ダーツの非同期は本当に非同期ですか?

done 
starting add -> 0 
ending add -> 10000000 
starting sub -> 10000000 
ending sub -> 0 

を生成し、次のコード

import 'dart:async'; 

var total = 0; 
final iterations = 10000000; 

Future add() async { 
    print('starting add -> $total'); 

    for (var i = 0; i < iterations; i++) { 
    total += 1; 
    } 

    print('ending add -> $total'); 
} 

Future sub() async { 
    print('starting sub -> $total'); 

    for (var i = 0; i < iterations; i++) { 
    total -= 1; 
    } 

    print('ending sub -> $total'); 
} 

void main(List<String> args) { 
    add(); 
    sub(); 
    print('done'); 
} 

を考えます。

はなく、お互いため、彼らは彼らの発信者のために非同期ですので、常に同じである第二のスレッドで実行されるすべてのasync方法のように見えます。

私は正しいですか?もしそうなら、どうすれば本当に非同期な方法で複数の関数を実行できますか(新しいスレッドの作成と同じです)?

編集

私はそれが、平行である必要がありますつもりはありません。パラレルでなくても非同期にすることができます。たとえば、1コアプロセッサは1サイクルにつき1命令を実行しますが、プロセスが1つずつ実行されるわけではありません。プロセッサーはすべてのプロセスをインターセルし、を同時に実行します。並列ではなく、です。 GIAのVMもこの動作をします。

これは、私がここでDart VMで見ている動作ではありません。非同期関数が呼び出されると、呼び出し元と同時に実行されますが、別の非同期関数には実行されません。私は非同期関数が呼び出し元だけでなく、すべてのものと並行していることを期待していました。

今はっきりしていることを願っています。

+1

"async to the caller"は、ほとんど非同期の定義です。それは、それらが(呼び出し元または他の何かに対して)並行して実行されることを意味するものではありません。 – Thilo

+0

@Thilo、はい、私は "非同期"は嘘だとは言えませんでしたが、その動作は私を挫折させます。私は、その呼び出し元だけでなく、すべてのものと非同期のものがあると予想していました。 – Gabriel

+0

これはJavascriptにコンパイルされたDartのバージョンですか?その場合、実行エンジンには1つのスレッドのみが存在します。 – Thilo

答えて

関連する問題