RubyKaigi Takeout 2021の途中ではあるけど、とりあえず自分の発表終わったのでメモ。
Ractorをワーカーとして使うアプリケーションサーバを作ったよ! という話なんですが、まあこれは話の入りというかそういうもので、実際の内容の中心はRactorではどういうコードが動かないのか、どうすればよいのか、みたいな話です。 で、Ractorで動かないコードは全体的には直していきたいよねということになると思いますが、そうはいっても動かしてみないと確認もできないじゃんということで、主な問題であるところのWebアプリケーションを実際にRactorの上で動かして確認できるようにしておきましたよ、というのが今回作ったright_speedです。
本当はRactorの数を増やしていくごとにどれくらいのリクエストを処理できるようになるのかとか、MJITを有効にしたときその傾向はどうなるのかとか試したかったんですが、それよりだいぶ手前のところでSEGVを踏んでしまって、セッション録画の提出日までにはちょっとどうにもできませんでした。残念。
副産物
新しい機能なもんで作業してる途中であれこれあって、明確なやつはbugsにいくつか報告してます。
- Bug #18024: Ractor crashes when connections are closed in multiple Ractors - Ruby master - Ruby Issue Tracking System
- Bug #18130: Showing exceptions from Ractor on console causes errors - Ruby master - Ruby Issue Tracking System
- Feature #18137: A new method to check Proc is isolated or not - Ruby master - Ruby Issue Tracking System
- Feature #18139: Add a method to stop/kill a Ractor from outside - Ruby master - Ruby Issue Tracking System
あとそのへんについてのパッチとか。
- Make ErrorHighlight.formatter Ractor-ready by tagomoris · Pull Request #4769 · ruby/ruby · GitHub
- Update the error message to make users understand the Proc is unshareable by tagomoris · Pull Request #4771 · ruby/ruby · GitHub
- Add Proc#isolated? by tagomoris · Pull Request #4785 · ruby/ruby · GitHub
SEGVってるやつは見てみてはいるんだけど明確にこれかなというのはまだ分かってない*1んで、どうにかなるかなあ。あとRactorまわりの話はいじってると割と簡単にプロセスがビジー状態になったりSEGVったりするのが厳しい。
フィードバック
定数に値を入れるときにデフォルトでshareableだとマークする方法が欲しい、マジックコメントかな? という議論がスライド中であるんだけど、発表中にコメント欄で@ko1さんに教えてもらった。
# shareable_constant_value: true class Foo VALUE = {key: "value"} end
Ractorのドキュメントにも書いてあったので完全に自分の見落としでした。すいません。
(追記) …… と思ったら今日直されていたのでたぶんドキュメント読んだときはmagic commentだと思わずそのままスルーして忘れてたんだな。無実だったことにしよう。