Agent.cast()
を使うことがあったので改めて動きを確認した
結論
Agent.cast()
は送り先がいなくても例外にならないAgent.cast()
は実行元にはすぐに戻るため、実行元に対して非同期で走る- 補足として、同じ(Elixir)プロセスに連続でcastした場合は、該当プロセス内では順序を守って(同期的に)実行される。正に1プロセス~レースコンディションしない様子
(もとになっている
GenServer.cast
も同様)
実験で使った処理
defmodule Sample do
use Agent
def start, do: Agent.start_link(fn -> "Hello" end, name: __MODULE__)
end
Sample.start()
Agent.cast(Sample, fn msg ->
IO.inspect(msg, label: "First")
:timer.sleep(1000)
IO.inspect(msg, label: "First")
"First done"
end)
Agent.cast(Sample, fn msg ->
IO.inspect(msg, label: "Second")
"Second done"
end)
IO.puts "END"
IO.gets "" # 処理待ちのお約束
結果は
END
First: "Hello"
First: "Hello"
Second: "First done"
になる