ひさしぶりのErlangネタです。Elixir(エリクサー)はErlang仮想マシン上で動作する言語ですが、使ったことがなかったので試してみました。
参照: https://employment.en-japan.com/engineerhub/entry/2017/06/12/110000
環境: macOS Sierra (brew install elixir)
hello_module.ex
1 2 3 4 5 6 7 8 9 |
defmodule HelloModule do def hello(name) do IO.puts "Hello, #{name}! pid: #{inspect self()}" receive do message -> IO.puts "Received: #{message}" hello(name) end end end |
メッセージを受信、表示するプログラムです。
送信は対話環境のIExで行います。
spawnでプロセスを生成して、そのpidに対してメッセージを送信します。
受信後プロセスが終了してしまうので、自分自身を呼び出し再度待ち状態にしています。
そしてProcess.exitでプロセスを明示的に終了させます。
次に、プロセスを監視してプロセスが終了したとき通知するプロセスリンクという仕組みをテストしてみます。
ソースコードは変更せず、spawnの代わりにspawn_linkを使います。
iexのプロセスにリンクしないように(iexが終了しないように)、trap_exitによってシステムブロセス(終了シグナルを受信しても終了しない)にするようです。
このように簡単にプロセス管理ができるあたりErlangらしいところです。
言語的には、Erlangより少し今風になっている感じでしようか。