Elixirとのタワムレ
みなさん如何お過ごしでしょうか? 私は一週間遅れてお盆休みを取ったので、実家に帰省中です。 今日は瀬戸内芸術祭の会場の一つである豊島に行ってきました。
心臓の音を聞いていたマン pic.twitter.com/yrbD98Oq2p
— Trs (@TrsNium) August 19, 2019
色々な作品があって、とても興味深かったです。
なんでElixirなん
さて本題ですが、elixirを触った理由は以下の理由があります。
Erlangは以前に勉強していたのですが、OTPやErlang VMの軽量プロセスの恩恵を感じられるような物を作ることができませんでした。 そこで今回はElixirを使ってみて、Erlangとのシンタックスなどの違い、軽量プロセス感の通信を使ったアプリケーションを作ってみてElixir, Erlang VMの良さに触れてみたいと考えました。 これらを考えた結果今回は、特定の深さ以下の任意のディレクトリ以下を走査し、ファイルの中に特定の単語があるか調べるプログラムを組んでみました。 github.com
アクターモデル
Erlang VMではプロセス間のメッセージ通信にアクターモデルの概念を念頭に行います。 僕は説明が上手くないので詳しくはwikipediaの基本概念部分を参照して欲しいです。 今回私が作成物のプロセスは以下の図のようにメッセージ通信をしています。
順を追って説明すると、
まずワーカープロセスがスケジューラーに:ready
というメッセージを送信します。
:ready
を受け取ったスケジューラーは、送り主のワーカープロセスに対し:work
, :idle
, :shutdown
の内どれかのメッセージを送り返します。
:work
はスケジューラーの中に実行すべきキューがまだある場合に送信されます。:work
を受け取ったワーカープロセスは勝利した結果を:answer
というメッセージで返信します。その後ワーカープロセスは、また:readyを送信するようになります。
:idle
は実行すべきキューは無いが、プロセスを待たせたいときに使い、:idle
を受け取ったワーカープロセスはn msほどスリープし:ready
を再び送信します。
:shutdown
は実行すべきキューが空かつ待ちが必要のないときに送信され、受け取ったワーカープロセスはexitします。
schedulerプロセスとワーカープロセスが相互に通信をしあい、溜まったキューの処理を進めていきます。 また複数のワーカープロセスを使うことでErlang VMがコンピューターリソースを効率的に使用します。
コンピューターリソースを全部使い切り太郎できている、最高 pic.twitter.com/2GS2cdS1yw
— Trs (@TrsNium) August 18, 2019
まとめ
オブジェクト指向は状態を元に振る舞いが変化するならば、アクターモデルは受け取った状態を元に振る舞いを変えるというような感じでしょうか。 どことなく似ているようで全然違うのですが、新しい概念に触れられて勉強になりました。 またErlang VMがワーカープロセスの数を増やせば増やすほどコンピュータリソースを食っていき、カツカツになっていく様を見るのは楽しかったです。 次はGenServerなんかに触れられたらなぁと思います。
参考
プロセス間のメッセージやり取りはプログラミングElixir
を参考にさせていただきました。
ありがとうございます。