にむかひて

Agent.castの動き

  • 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"

になる

サイト内検索