この記事は Elixir その2 Advent Calendar 2020 17日目です。
前日は、「[Elixir] GenServerのアイドルタイムアウト」でした。
はじめに
さて、Elixirはプロセスが軽量でGenServerを用いて手軽に扱えAWESOMEです。
ですが、OOPになれたプログラマがGenServerを使ってると、無意識にプロセスをOOPのオブジェクトのように使いがちです。
また、Elixirで簡単に並行処理ができるといって、何でも並行処理にすればよいというわけでもないはずです。
その辺に警鐘をならす方々がいます。
Elixir作者のJose Valimさん
「なんのためにGenServerを使ってるの?何かボトルネックでもあるの?もし、ただコードと整理したいだけなんやったら、モジュールと関数で解決できるやん。別にプロセス使わなくても。」
「Elixir in Action」著者のSasa Juricさん
「ひとつのプロセスで複雑な状態管理できるのか。確実にできますよ。単純な関数による抽象化により、複雑な状態の関心事を分けることができます。プロセスを複数つかうことなく。だからといってプロセスをつかうなということではなく、プロセスをつかうメリットがある場合はどんどん使ったら良い。」
- プロセスをどう使用するかは、ランタイムの関心事である。コードをどう整理するかではない。
- 専用のプロセスを検討するガイドライン
- コードが長い間使用される場合。
- コードが再利用可能な資源を扱う場合。(TCP接続、ファイル、データベース、OSプロセスへのパイプ等)
- 重要なコードは同期させたほうがよい。たった一つの専用プロセスで処理する。
さいごに
今後更に新しいことを学んだら随時内容も更新していこうと思います。
明日は「[Elixir] GenServer.init関数で重い処理」です。引き続き、Elixirを楽しみましょう。
Happy coding!