threadpool

Nim における spawn (プロセス生成) の実装です。

関連:

この API は不安定です。

FlowVarBase = ref FlowVarBaseObj
Untyped 型による FlowVar[T] の基底クラスです。  ソース 編集
FlowVar[T] {...}{.compilerProc.} = ref FlowVarObj[T]
データフロー変数。  ソース 編集
ThreadId = range[0 .. MaxDistinguishedThread - 1]
  ソース 編集

定数

MaxThreadPoolSize = 256
スレッドプールの最大サイズです。どのような場合でも 256 スレッドで十分足ります ;-)   ソース 編集
MaxDistinguishedThread = 32
"有名"スレッドの最大数です。  ソース 編集

プロシージャ

proc blockUntil(fv: FlowVarBase) {...}{.raises: [], tags: [].}

fv の到着までの待機回数値です。

通常、これを明示的に呼び出す必要はありません。

  ソース 編集
proc awaitAndThen[T](fv: FlowVar[T]; action: proc (x: T) {...}{.closure.})

fv が利用可能になるまでブロックを行った後に action へ値を渡します。

これは Nim におけるパラメータ渡しの意味規則 (semantics) になっていることに注意してください。つまり awaitAndThenT をコピーしなくて済むため ^ プロシージャよりも効率が改善することがあります。

  ソース 編集
proc unsafeRead[T](fv: FlowVar[ref T]): ptr T
値が利用可能になるまでブロックを行った後に、この値を渡します。  ソース 編集
proc `^`[T](fv: FlowVar[ref T]): ref T
値が利用可能になるまでブロックを行った後に、この値を渡します。  ソース 編集
proc `^`[T](fv: FlowVar[T]): T
値が利用可能になるまでブロックを行った後に、この値を渡します。  ソース 編集
proc blockUntilAny(flowVars: openArray[FlowVarBase]): int {...}{.raises: [], tags: [].}

指定された flowVars を非同期待機します。到着後の値として flowVar のインデックスを返します。

flowVarblockUntilAny を同時に呼び出したときに限り機能します。つまり、 blockUntilAny([a,b])blockUntilAny([b,c]) を次に呼び出すまで c のみをブロックします。待機可能な flowVar が残っていないときは、 -1 を返します。

備考: これは不確定動作となるため避けてください。

  ソース 編集
proc isReady(fv: FlowVarBase): bool {...}{.raises: [], tags: [].}

指定された FlowVarBase の値が利用可能であるか判定します。

trueならば、非同期 fv はブロックされていません。

  ソース 編集
proc setMinPoolSize(size: range[1 .. MaxThreadPoolSize]) {...}{.raises: [], tags: [].}
スレッドプールの最小サイズを設定します。デフォルト値は 4 です。  ソース 編集
proc setMaxPoolSize(size: range[1 .. MaxThreadPoolSize]) {...}{.raises: [], tags: [].}
スレッドプールの最大サイズを設定します。このデフォルト値は MaxThreadPoolSize (256) です。  ソース 編集
proc preferSpawn(): bool {...}{.raises: [], tags: [].}

このプロシージャは spawn または直接呼び出しが望ましいか即時判定するときにお使いください。

true のときは、 spawn が理に適います。通常、これをそのまま呼び出す必要はありません。 spawnX テンプレートをお使いください。

  ソース 編集
proc spawn(call: typed): void {...}{.magic: "Spawn".}

新規タスクを強制生成します。呼び出しスレッドで call は実行されません。

call において p は gcsafe であるため proc call p(...) にしてください。なお、返値型は void または FlowVar[T] と互換性があります。

  ソース 編集
proc pinnedSpawn(id: ThreadId; call: typed): void {...}{.magic: "Spawn".}

ワーカースレッドへ id を指定して新規タスクを強制生成します。スレッドで call が実行されます。

call において p は gcsafe であるため proc call p(...) にしてください。なお、返値型は void または FlowVar[T] と互換性があります。

  ソース 編集
proc parallel(body: untyped) {...}{.magic: "Parallel".}

並列セクションはブロックの並列実行で使います。

body はドメイン特化言語 (DSL) であり処理に特化した言語のサブセットです。

詳細情報は取扱説明書を参照してください。

  ソース 編集
proc sync() {...}{.raises: [], tags: [TimeEffect].}

生成済み (spawn'ed) の全タスクにシンプルな待機障壁 (バリア) を適用します。

もっと手の込んだ待機処理をお求めであれば、明示的に障壁をお使いください。

  ソース 編集

テンプレート

template spawnX(call): void

CPU コアの準備できているときは新規タスクを生成しますが、そうでなければ呼び出しスレッドで call を実行します。

通常、不特定の経過時間による生成元の実行阻止ではなく spawn プロシージャの使用をお勧めします。

call において p は gcsafe であるため proc call p(...) にしてください。なお、返値型は 'void' または FlowVar[T] と互換性があります。

  ソース 編集