Next: control.job - 制御モジュールのための汎用ジョブ記述子, Previous: control.cseq - 並行シーケンス, Up: ライブラリモジュール - ユーティリティ [Contents][Index]
control.future - Futurefutureは並行計算を簡単にする構造です。
指定された式の計算を並行して行います。計算結果は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を返します。
Next: control.job - 制御モジュールのための汎用ジョブ記述子, Previous: control.cseq - 並行シーケンス, Up: ライブラリモジュール - ユーティリティ [Contents][Index]