2016-11-03 2 views
2

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.

+1

"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

+0

@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

+0

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

Antwort

6

So funktioniert async. Es gibt nur einen Thread und eine Ereigniswarteschlange, in der Aufgaben in die Warteschlange eingereiht werden. Wenn die vorherige Synchronisierungsausführung abgeschlossen ist, wird die nächste Task in der Warteschlange ausgeführt.

Wenn Sie eine parallele Ausführung benötigen, können Sie Isolate verwenden.

Siehe

Update

-Code in Dart auch (und wenn transpiled zu JS) ist Single-Thread ausgeführt. Nur ein Ausführungs-Thread wird gleichzeitig ausgeführt. Wenn eine Aufgabe aus der Aufgabenwarteschlange ausgeführt werden soll, wird sie ohne Unterbrechung ausgeführt, bis sie abgeschlossen ist. Wenn dieser Code asynchrone Operationen aufruft, werden diese asynchronen Aufrufe zur Warteschlange hinzugefügt und ausgeführt, wenn sie fällig sind.

Im Detail ist es ein bisschen komplizierter, da es zusätzlich zur Ereigniswarteschlange Mikrotasks gibt. Mikrotasks werden verarbeitet, bevor die nächste Aufgabe aus der Aufgabenwarteschlange bearbeitet wird, aber dies ändert nicht, dass immer eine Aufgabe nach der anderen ohne Unterbrechung ausgeführt wird.

Aus diesem Grund ist es wichtig, keine langen Berechnungen im UI-Thread auszuführen, da die Benutzeroberfläche dadurch nicht reagiert.

Verwandte Themen