16.7 処理の待ち合わせをしたい(Future/Promiseパターン)

Future/Promiseは、1977年に論文で紹介されたタスク分割の手法です。重い処理がすべて独立しているのであれば、前述のWaitGroupErrGroupで十分です。Future/Promiseは、お互いのタスクに依存関係がありグラフ構造をしているときに使えるパターンです。

Future/Promiseを使う場合は、「今はまだ得られてないけど将来得られるはずの入力」(Future)を使って必要な条件がそろったら実行されるロジックを実装します。 Futureと対になるのが「将来、値を提供するという約束」(Promise)で、これが満たされると、Futureを使ったロジックが実行されます。

note

Javaでは、バージョン1.5から標準ライブラリのjava.util.concurrent.Futureとして導入されています。

次のようなすごく重い計算処理(エミュレーションのためにスリープで実現しています)があるとします。AとBは単独で動作しますが、CはAとB、DはAとCに依存しています。

func A() int {
	time.Sleep(time.Second)
	return 10
}

func B() int {
	time.Sleep(time.Second * 2)
	return 5
}

func C(a, b int) int {
	time.Sleep(time.Second * 1)