Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ZIOで触るSTM

keiSunagawa
September 25, 2020
250

 ZIOで触るSTM

keiSunagawa

September 25, 2020
Tweet

Transcript

  1. (Software) Transactional Memory - 並列処理を制御するための仕組み/実装 - DBトランザクションのようなトランザクションをメモリ上のデータに対して提 供する - 悲観ロック

    - commit時にデータの変更を検知し、処理時とのデータの相違があれば先 頭から処理をやり直す - Software Transactional Memory(STM)はTransaction Memoryをソフト ウェア上(特定の言語上など)で実装したもの
  2. ZIO 元々はscalaz8のIOモナドとして開発されていたライブラリだが、現在はスタンドアロンなライブラリとしてリリースされている。 IOモナドとは元々Haskellの技術で副作用をコンテキストとして持つ値で、副作用が失敗したときの例外処理などをハンドリ ング/mask/割り込みなどのための様々な関数が定義されている。正しく言うと IO自体はただのデータ型でIOデータ型がモナ ド型クラスを実装している。 ScalaでのIOモナドは並列処理周りの実装やヘルパー関数も定義されており、 HaskellのIOモナ ドよりさらに機能が拡張されている場合が多い。 IO値は遅延性のタスクであり、定義のみでは実行されず

    run関数を発火する ことで実行することができる、さらに IOは再利用可能であるため、 run関数はなんども呼び出すことができる (その度に副作用 タスクが実行される)。IOはモナドを実装しているため合成が可能で、一般的には for syntaxを利用して逐次処理同様に書く ことができる。scalaに置けるIOの代表的な実装としてはcats.effect.IOがあり、IOの類似や派生としてmonix TaskやZIOが 存在する。これらは総称してエフェクトラッパーと呼ばれることがある。 ZIOはIOモナドにさらにDI機能を追加したりエラー型を 任意の型に束縛できるようにしたりとさらにリッチにしたもので型として ZIO[R, E, A]となりRがDIするmoduleの型、Eがエ ラー型、AがIOタスクの戻り値となる。Rの値にはaccessM関数でアクセスすることが可能でこれの戻り値は ZIOとなり、つま りRにアクセスする場合は必ず ZIOコンテキストになる。ZIOはそのほかにもSTMやStreamなど並列処理を行うに当たって 有用なモジュールも提供されており、大体の処理を ZIOのみで完結できるようになっている、反対に cats.effect.IOなどとの相 互変改も提供されており他エフェクトラッパーとの共存や、移行などもやりやすいようになっている。
  3. ZIOで提供されているモジュール(一例) - ZIO DI機能付きエフェクトラッパー - Fiber マイクロスレッド - Ref AtomicRefalence

    - Semaphore セマフォ - Chunk Arrayベースのハイパフォーマンス Collection - Queue 非同期で利用可能なQueue - Managed Closableなリソースを扱うためのモジュール (≒ cats.effect.Resource) - STM 悲観ロック トランザクション - Stream stream処理