LoginSignup
6
0

[Elixir] プロセス使用を検討する基準

Last updated at Posted at 2020-12-16

この記事は Elixir その2 Advent Calendar 2020 17日目です。

前日は、「[Elixir] GenServerのアイドルタイムアウト」でした。

はじめに

さて、Elixirはプロセスが軽量でGenServerを用いて手軽に扱えAWESOMEです。
ですが、OOPになれたプログラマがGenServerを使ってると、無意識にプロセスをOOPのオブジェクトのように使いがちです。
また、Elixirで簡単に並行処理ができるといって、何でも並行処理にすればよいというわけでもないはずです。

その辺に警鐘をならす方々がいます。

Elixir作者のJose Valimさん

... what the GenServer is giving us besides adding a potential bottleneck? If the concern is code organization, then modules and functions are the correct level to address it, not processes.

「なんのためにGenServerを使ってるの?何かボトルネックでもあるの?もし、ただコードと整理したいだけなんやったら、モジュールと関数で解決できるやん。別にプロセス使わなくても。」

「Elixir in Action」著者のSasa Juricさん

So, can we manage a complex state in a single process? We certainly can! Simple functional abstractions ... allowed me to separate concerns of a more complex round state without needing to resort to agents. That doesn’t mean we need to be conservative with processes though. Use processes wherever they make sense and bring some clear benefits.

「ひとつのプロセスで複雑な状態管理できるのか。確実にできますよ。単純な関数による抽象化により、複雑な状態の関心事を分けることができます。プロセスを複数つかうことなく。だからといってプロセスをつかうなということではなく、プロセスをつかうメリットがある場合はどんどん使ったら良い。」

  • プロセスをどう使用するかは、ランタイムの関心事である。コードをどう整理するかではない。
  • 専用のプロセスを検討するガイドライン
    • コードが長い間使用される場合。
    • コードが再利用可能な資源を扱う場合。(TCP接続、ファイル、データベース、OSプロセスへのパイプ等)
    • 重要なコードは同期させたほうがよい。たった一つの専用プロセスで処理する。

さいごに

今後更に新しいことを学んだら随時内容も更新していこうと思います。


明日は「[Elixir] GenServer.init関数で重い処理」です。引き続き、Elixirを楽しみましょう。

Happy coding!

6
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
0