なんもわからんな

Elixirとのタワムレ

みなさん如何お過ごしでしょうか? 私は一週間遅れてお盆休みを取ったので、実家に帰省中です。 今日は瀬戸内芸術祭の会場の一つである豊島に行ってきました。

色々な作品があって、とても興味深かったです。

なんでElixirなん

さて本題ですが、elixirを触った理由は以下の理由があります。

Erlangは以前に勉強していたのですが、OTPやErlang VMの軽量プロセスの恩恵を感じられるような物を作ることができませんでした。 そこで今回はElixirを使ってみて、Erlangとのシンタックスなどの違い、軽量プロセス感の通信を使ったアプリケーションを作ってみてElixir, Erlang VMの良さに触れてみたいと考えました。 これらを考えた結果今回は、特定の深さ以下の任意のディレクトリ以下を走査し、ファイルの中に特定の単語があるか調べるプログラムを組んでみました。 github.com

アクターモデル

Erlang VMではプロセス間のメッセージ通信にアクターモデルの概念を念頭に行います。 僕は説明が上手くないので詳しくはwikipediaの基本概念部分を参照して欲しいです。 今回私が作成物のプロセスは以下の図のようにメッセージ通信をしています。 f:id:yakuta55:20190819184616p:plain

順を追って説明すると、 まずワーカープロセスがスケジューラーに:readyというメッセージを送信します。 :readyを受け取ったスケジューラーは、送り主のワーカープロセスに対し:work, :idle, :shutdownの内どれかのメッセージを送り返します。

:workはスケジューラーの中に実行すべきキューがまだある場合に送信されます。:workを受け取ったワーカープロセスは勝利した結果を:answerというメッセージで返信します。その後ワーカープロセスは、また:readyを送信するようになります。

:idleは実行すべきキューは無いが、プロセスを待たせたいときに使い、:idleを受け取ったワーカープロセスはn msほどスリープし:readyを再び送信します。

:shutdownは実行すべきキューが空かつ待ちが必要のないときに送信され、受け取ったワーカープロセスはexitします。

schedulerプロセスとワーカープロセスが相互に通信をしあい、溜まったキューの処理を進めていきます。 また複数のワーカープロセスを使うことでErlang VMがコンピューターリソースを効率的に使用します。

まとめ

オブジェクト指向は状態を元に振る舞いが変化するならば、アクターモデルは受け取った状態を元に振る舞いを変えるというような感じでしょうか。 どことなく似ているようで全然違うのですが、新しい概念に触れられて勉強になりました。 またErlang VMがワーカープロセスの数を増やせば増やすほどコンピュータリソースを食っていき、カツカツになっていく様を見るのは楽しかったです。 次はGenServerなんかに触れられたらなぁと思います。

参考

プロセス間のメッセージやり取りはプログラミングElixirを参考にさせていただきました。 ありがとうございます。