Crystalは軽量スレッドを切り替えるためのランタイムスケジューラをもってる。少し調べてみた。 OSスレッドはカーネルのスケジューラによって切り替わるが、軽量スレッドはユーザが切り替えの責任をもつ。 spawn で生成した軽量スレッドは sleep を呼ぶことで別の軽量スレッドに明示的に処理を切り替えることができる。 fiberで生成するだけではスケジューラの管理下にはおかれない。 spawn の中でブロックする処理をかくと全てのタスクがブロックする。 スケジューラはタスクをキューで管理していて、後から追加された軽量スレッドの処理からみていくが、sleep で明示的に切り替えを行った場合はlibevent2のタイマーによって処理が発火されるので実行順は不定となる。 キューから取り出して実行したタスクが未完了だった場合に再びキューの末尾に追加する。 よく引き合いに出されるGolangのスケ