For Development HEAD DRAFTSearch (procedure/syntax/module):

12.7 control.future - Future

Module: control.future

futureは並行計算を簡単にする構造です。

指定された式の計算を並行して行います。計算結果はfuture-getで取り出すことができます。

futureはMultiLispで実装されました。 MultiLispのfutureは暗黙的、つまり計算が終わるとその結果に自動的に置き換わるものでした。 RacketとGuileはライブラリでfutureを提供していますが、 結果の取り出しをtouchと呼んでいます。touchという名前は一般的にすぎるので、 Gaucheではfuture-getと呼ぶことにしました。

Macro: future expr

{control.future} exprを別スレッドで計算するfutureオブジェクトを返します。 exprの結果はfuture-getで取り出せます。 (exprは多値を生成することもできます)。

exprfuture式と同じ環境で評価されます。 ただし、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)
    ...))
Function: make-future thunk

{control.future} thunkを別スレッドで呼ぶfutureを返します。

(future expr) ≡ (make-future (lambda () expr))
Function: future? obj

{control.future} objがfutureなら#tを、そうでなければ#tを返します。

Function: future-get future :optional timeout timeout-val

{control.future} 引数はfutureでなければなりません。futureの結果を取り出します。

futureの結果が既に求まっていれば、この手続きはただちにそれを返します。 まだ計算中であった場合は、デフォルトでこの手続きは計算が終わるまでブロックします。 待つ時間の上限をtimeout引数で指定することもできます。 timeout#f(デフォルト)なら無制限に待ち、 非負実数ならその秒数だけ待ち、<time>オブジェクトならそれで指定される 絶対時間まで待ちます。タイムアウトが起きた場合はtimeout-valが返されます。 デフォルトは#fです。 future-getを複数回呼んでも同じ結果が返されます。

futureの計算中に捕捉されない例外が投げられた場合、それはfuture-getを呼んだ時点で future-getの動的環境で再び投げられます。 そのfutureにもう一度future-getを呼んだ場合の動作は未定義です (現在は、二度目以降は例外を投げることなく#<undef>が返されますが、 将来変わる可能性があります)。

Function: future-done? future

{control.future} futureの計算が終わっていれば#tを、そうでなければ#fを返します。



For Development HEAD DRAFTSearch (procedure/syntax/module):
DRAFT