The King's Museum

ソフトウェアエンジニアのブログ。

Dart の非同期プログラミング(Future, async/await)

仕事で Flutter をちょっといじっていて、いい加減 async あたりをちゃんと理解しておこうと思ったのでメモ。

https://dart.dev/tutorials/language/futures

Dart コードはシングルスレッドで実行される

Dart は基本的にシングルスレッドで実行される。 並列処理を行いたい場合は Isolate を利用する。

Future は非同期オペレーションの結果を表す

Future は非同期オペレーションの結果を表している。 ここは Java と同じだね。

Future が完了するまで待つには async 関数で await を使う

void main() async {
  await something();
  print('all done');
}

await を使うためには関数に async を付与する必要がある。

async 関数では以下の条件のいずれかを満たすまで同期的に実行される。 以下のどれかにたどりつくと Future を返し、非同期的に実行される。

  • 関数で最初の await
  • return
  • 関数の終わり

await のあれこれ

await expressionexpression は通常 Future を返す関数である。 しかし、expression が Future を返さない場合は、自動的に Future でラップされる。

なお、await expression 文自体は Future の完了した値を返す。

import "dartd:async";

void main() async {
   // 自動的に Future にラップされ、Future の完了値 int を返す
   int i = await something();
   print(i);
}


int something() {
  return 1;
}

完了を待ちつつスレッドをブロックしない、っていうのが await で気楽に使えるのはいいなぁ。

(c) The King's Museum