2

私はダーツの未来を学んでおり、Future.

Dart はシングル スレッドであり、Futureファイルの読み取りなど、高価な関数を後で実行するために使用できます。

ファイルの読み取りに 10 秒かかり、読み取るファイルが 3 つあるとします。

私のダーツコード:

main() {
  readFile("aaa.txt");
  readFile("bbb.txt");
  readFile("ccc.txt");
  print("Will print the content of the files later");
}

readFile(String filename) {
  File file = new File(filename);
  file.readAsString().then((content) {
    print("File content:\n");
    print(content);
  });
}

ファイルの読み込みには 10 秒かかるので、上記のコードは少なくとも 30 秒かかりますよね? 現在のコードをブロックすることなく、コストのかかるタスクを後で 1 つずつ実行するためだけにファイルを読み取るための先物を使用しますが、総コストは削減されませんか?

Java でスレッド プールを作成し、3 つの将来のタスクを並行して実行できる場合、総コストは 10 ~ 20 秒になります。

Dartで同じことをすることは可能ですか? Dart の分離を使用することが唯一の解決策ですか?

4

2 に答える 2

3

3 つの読み取りが開始され、読み取りが完了すると、それぞれが「then」関数へのコールバックをキューに入れるため、これに10 秒かかると予想されます。3 つのファイルが並行してロードされ、10 秒後にすべてが完了する可能性は十分にあります。ただし、コールバックはメイン スレッドで順次呼び出されます。

Dart のユーザー コードはシングル スレッドですが (Isolate や Web ワーカーを使用しないと仮定して)、実装がスレッドを作成できない、またはオペレーティング システムの非同期読み込みを使用してタスクを並行して実行できないということは何もありません。メインスレッドで順番に。

于 2014-02-03T13:10:42.777 に答える
2

そのとおりです。new Timer()new Future()、またはで新しい非同期パスを開始すると、scheduleMicrotask()後で実行するようにスケジュールされます。

非同期パスの 1 つがネットワーク リクエストまたはファイル システムからデータが返されるのを待っているときに、その間に別の非同期パスが飛び込んで実行されることがあります。したがって、実行時間が 30 秒未満になる可能性がありますが、CPU を追加して実行時間を短縮することはできません。スケジューリングがいつ行われ、どのように正確に機能するかについての詳細はわかりません。

Dart にはスレッドがないため、コードを並行して実行したい場合は、isolate が必要です。

于 2014-02-02T16:41:54.747 に答える