IsolateとFutureについて間違った考えを持っているかもしれません。それを片付けるのを手伝ってください。これが両方の主題についての私の理解です。
分離: Isolates 独自のイベントループでコードを実行します。各イベントは、ネストされたマイクロタスクキューで小さなタスクを実行できます。
Future:Futureは、将来のある時点で利用可能になる可能性のある値またはエラーを表すために使用されます。
私の混乱は:
ドクターは、分離には独自のループがあると言っていますか?独自のイベントキューがある方が理にかなっていると思いますが、間違っていますか?
将来的にはメインのIsolateで非同期に実行されますか?将来のタスクが実際にイベントキューの最後に配置されると想定しているため、将来ループで実行される場合。私が間違っている場合は私を修正します。
未来があるのになぜアイソレートを使うのですか? Futureの代わりにIsolateを使用して重いタスクを実行する例をいくつか見ました。しかし、なぜ?将来的にメインの分離キューで非同期に実行する場合にのみ意味があります。
みんなありがとう、あなたの応答に感謝します。
Future
は、非同期実行が完了したときに通知を受け取ることができるハンドルです。非同期実行はイベントキューを使用し、コードは同じスレッド内で同時に実行されます。
https://webdev.dartlang.org/articles/performance/event-loop
Dartコードは、デフォルトではルートアイソレートで実行されます。
通常は別のスレッドで実行される追加の分離プログラムを起動できます。分離株は、ルート分離株が開始されたのと同じDartコードからロードできます(main()
とは異なるエントリポイントを使用) https://api.dartlang.org/stable/2.0。 0/Dart-isolate/Isolate/spawn.html )または別のDartコード(一部のDartファイルまたはURLからロードされます https://api.dartlang.org/stable/2.0.0/Dart- isolate/Isolate/spawnUri.html )。
アイソレートは状態を共有せず、メッセージパッシング(SendPort/ReceivePort)を使用してのみ通信できます。各分離株には独自のイベントキューがあります。
一言で言えば、
Isolates:Dartはシングルスレッドですが、Isolates(多くのプロセス)を使用してマルチスレッドを実行できます。
Future:Futureは、Dartが非同期作業を完了したときに返される結果です。作業は通常、そのシングルスレッドで行われます。
Dartがマルチスレッドでない場合でも、分離はスレッドと比較できます。先物が同じメモリを共有するとき、それは実際にそれ自身のメモリとイベントループを持っています
Dartは、Isolates(Dart2jsのWebワーカー)と呼ばれるスタンドアロンプロセスを生成できます。これは、メインプログラムのときはメモリを共有しませんが、非同期で、別のプロセス(事実上、ソートのスレッド)はブロックせずに計算を実行できます。メインスレッド。
Futureは、それを呼び出したIsolate内で実行されますが、必ずしもメインのIsolateではありません。
私はこれをお勧めします 記事 これは私より良い説明があります。