den folgenden CodeIst Dart's Async wirklich asynchron?
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');
}
gegeben, die die folgende Ausgabe erzeugt
done
starting add -> 0
ending add -> 10000000
starting sub -> 10000000
ending sub -> 0
Ich frage mich, ob async
Anrufe wirklich in einem Asynchron-Mode ausgeführt werden.
Es sieht aus wie alle async
Methoden in einem zweiten Thread ausgeführt werden, die immer das gleiche ist, so sie für ihre Anrufer async sind, aber nicht für sich.
Bin ich richtig? Wenn ja, wie kann ich mehrere Funktionen wirklich asynchron ausführen (genauso wie neue Threads erstellen)?
bearbeiten
Ich sage nicht, es parallel sein muss. Es kann asynchron sein, ohne parallel zu sein. Zum Beispiel führt ein 1-Kern-Prozessor 1 Anweisung pro Zyklus aus, aber das bedeutet nicht, dass die Prozesse einzeln ausgeführt werden. Der Prozessor intercalle alle Prozesse und führt sie gleichzeitig, nicht parallel. Eine VM mit GIA hat dieses Verhalten ebenfalls.
Dies ist nicht das Verhalten, das ich hier auf Dart VM sehe. Wenn eine asynchrone Funktion aufgerufen wird, wird sie gleichzeitig mit ihrem Aufrufer ausgeführt, nicht jedoch mit anderen asynchronen Funktionen. Ich hatte erwartet, dass eine asynchrone Funktion nicht nur für den Aufrufer, sondern für alle anderen gleichzeitig war.
Ich hoffe es ist jetzt klar.
"async zum Anrufer" ist so ziemlich die Definition von async. Es bedeutet nicht, dass sie parallel ausgeführt werden (zum Anrufer oder irgendetwas anderem). – Thilo
@Thilo, ja, ich könnte nicht sagen "Async" ist eine Lüge, aber sein Verhalten frustriert mich. Ich erwartete etwas Asynchrones zu allem, nicht nur zu seinem Anrufer. – Gabriel
Ist dies eine Version von Dart, die in Javascript kompiliert wird? Wenn dies der Fall ist, gibt es nur einen einzigen Thread in der Ausführungs-Engine. – Thilo