asyncを使わずに並行処理をやる方法はないのか
2023-09-13
Techメモです。
- What Color is Your Function? – journal.stuffwithstuff.com
- async/awaitを実装した言語では、asyncな関数とそうでない関数が区別される
- つまり、async funcを受け取るメソッドにnormal funcを渡すことはできない(逆もしかり)
- そのために、.mapと.mapAsyncみたいに各APIにasync版と非async版が必要になる
- https://blog.yoshuawuyts.com/announcing-the-keyword-generics-initiative/
- keyword genericsという案
なぜasyncな関数と普通の関数は互換性がないのか
- async funcはステートマシンにコンパイルされるから
- (いやまあ別にそういう決まりはないけど、JS/Rust/C#はいずれもそうしている)
asyncを使わずに並行処理をやる方法はないのか
- ある。一つはThread
- ただスレッドだけだと、時間がかかる処理をやっているスレッドは何もせず待っていることになる
- そういったスレッドばかりだと効率が悪い
- このためJavaはvirtual threadという機能を試している
- 一つはスタックフルコルーチン
- Luaのcoroutine、RubyのFiber、Goのgoroutine
- async/awaitと違い関数に色がつかない
- その代わりコルーチンのスケジューラをランタイムとして持つ必要があるので、サイズを小さくしたい場面では不利
- Goをwasmで動かすことはできるがRust等と比べるとサイズがでかくなる
- 一つは一級継続
- 継続をゲスト言語レベルで扱える機能があれば、並行処理はユーザランドで好きに書ける(はず)
- 継続にもいろいろあるが、async/await相当を実現するだけならSchemeのような継続でなく、delimitedかつone-shotな継続でよい
- OCaml Effecsは並行処理の下回りとして導入された