control.future
- Future ¶futureは並行計算を簡単にする構造です。
指定された式の計算を並行して行います。計算結果はfuture-get
で取り出すことができます。
futureはMultiLispで実装されました。
MultiLispのfutureは暗黙的、つまり計算が終わるとその結果に自動的に置き換わるものでした。
RacketとGuileはライブラリでfutureを提供していますが、
結果の取り出しをtouch
と呼んでいます。touch
という名前は一般的にすぎるので、
Gaucheではfuture-get
と呼ぶことにしました。
{control.future
}
exprを別スレッドで計算するfutureオブジェクトを返します。
exprの結果はfuture-get
で取り出せます。
(exprは多値を生成することもできます)。
exprはfuture
式と同じ環境で評価されます。
ただし、exprが捕捉されない例外を投げた場合は、future-get
が呼ばれるまで
その例外の配送は遅延されます。
次の例では、HTTPアクセスを他の計算と並行して走らせて、後で結果を取り出しています。
(use control.future) (use rfc.http) (let1 f (future (http-get "example.com" "/")) ... some computation ... (receive (code headers body) (future-get f) ...))
{control.future
}
thunkを別スレッドで呼ぶfutureを返します。
(future expr) ≡ (make-future (lambda () expr))
{control.future
}
objがfutureなら#t
を、そうでなければ#t
を返します。
{control.future
}
引数はfutureでなければなりません。futureの結果を取り出します。
futureの結果が既に求まっていれば、この手続きはただちにそれを返します。
まだ計算中であった場合は、デフォルトでこの手続きは計算が終わるまでブロックします。
待つ時間の上限をtimeout引数で指定することもできます。
timeoutが#f
(デフォルト)なら無制限に待ち、
非負実数ならその秒数だけ待ち、<time>
オブジェクトならそれで指定される
絶対時間まで待ちます。タイムアウトが起きた場合はtimeout-valが返されます。
デフォルトは#f
です。
future-get
を複数回呼んでも同じ結果が返されます。
futureの計算中に捕捉されない例外が投げられた場合、それはfuture-get
を呼んだ時点で
future-get
の動的環境で再び投げられます。
そのfutureにもう一度future-get
を呼んだ場合の動作は未定義です
(現在は、二度目以降は例外を投げることなく#<undef>
が返されますが、
将来変わる可能性があります)。
{control.future
}
futureの計算が終わっていれば#t
を、そうでなければ#f
を返します。