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で見ている動作ではありません。非同期関数が呼び出されると、呼び出し元と同時に実行されますが、別の非同期関数には実行されません。私は非同期関数が呼び出し元だけでなく、すべてのものと並行していることを期待していました。
今はっきりしていることを願っています。
"async to the caller"は、ほとんど非同期の定義です。それは、それらが(呼び出し元または他の何かに対して)並行して実行されることを意味するものではありません。 – Thilo
@Thilo、はい、私は "非同期"は嘘だとは言えませんでしたが、その動作は私を挫折させます。私は、その呼び出し元だけでなく、すべてのものと非同期のものがあると予想していました。 – Gabriel
これはJavascriptにコンパイルされたDartのバージョンですか?その場合、実行エンジンには1つのスレッドのみが存在します。 – Thilo