cats effect
IOは計算を構築する
計算のロジック、リソースの制御
Fiberは計算自体を制御する
グリーンスレッドでの非同期、並列、同期
IOは実行機構のFiberと密結合
概要
副作用を扱うIOモナド
完全に制御可能な非同期処理を実現するためのランタイム
合成可能
キャンセル可能
中断可能
非同期コールバック
リソース安全
HaskellのIOマネージャーを参考にして作られた
Fiber
Fiberはcats effectの非同期ランタイムの抽象的なモデル
スレッドと違ってJVM上のオブジェクトだから素早く大量に生み出せる
first-class support for asynchronous callbacks, resource handling, and cancelation (interruption) for all fibers.
main fiberが終了した時にアプリケーションが終了
Cancelation
Fiberのキャンセル機構はJavaThread#interruptよりもロバスト/信頼性がある/より安全
Fiberがキャンセルされた時にはファイナライズで必ずリソースが解放される
IO.uncancelableを使って途中でキャンセルされたくない一連の処理を定義できる→アトミック性が保証される
In particular, every step of a fiber contains a cancelation check. This is similar to what interrupt would do if the JVM checked the interruption flag on every ;
キャンセルする定番の状況
タイムアウト
エラー
用語
非同期と並列は違う概念だよ
Asynchronous(非同期)
asyncメソッドで定義される
結果はコールバック⇄Syncの結果はreturn
Asynchronous" simply means "produces values or errors using a callback rather than return/throw".
Concurrent(並行)
コード上のセマンティクスの話では実際にそれが並列で実行されるかはランタイムによる
fiberをstart,joinさせるスタイル
複数のアクションを同時に実行して実行結果を待つ
(callServiceA(params1), callServiceB(params2)).parTupled
structured concurrency operators
parTupled、parMapN、parTraverse
これを優先して使って、次点でfiberの直接start\joinを考慮する
Parallel(並列)
書いたコードが実際に複数同時に並列で評価されるのか?という実行環境の話。前者とは話題のレイヤーが異なる。
実際に処理が同時に走るかどうか
Concurrentな記述であってもjs実行環境であればシングルスレットなので並列にはなり得ない。jvm実行環境であれば並列になる。
Effects(作用)
評価した時に何が起こるか、アクションの記述
Side-Effects(副作用)
返り値以外で外の世界を変化させるような動作
参照透過じゃなくなる
IOのような副作用を発生させるアクションを実行した場合
In Cats Effect, code containing side-effects should always be wrapped in one of the "special" constructors. In particular:
Synchronous (returns or throws)
IO(...) or IO.delay(...)
IO.blocking(...)
IO.interruptible(...)
IO.interruptibleMany(...)
Asynchronous (invokes a callback)
IO.async or IO.async_