Tokyo.ex #8 (2017/11/26)
"current"
と"old"
current
とold
のコードはどちらも実行可能current
を使う
current
にcurrent
をold
にするold
を捨てる
old
を実行中のプロセスはbrutal kill
old
からcurrent
に切り替わるようにしなければならない
GenServer
などを書いてればだいたい大丈夫old
を消してcurrent
だけにしようとする
old
実行中プロセスがkillされる:release_handler.make_permanent/1
をテキトーに呼ぶと危険loop.ex
などとして保存> c("loop.ex")
> spawn_link(fn -> Loop.loop(0) end)
> c("loop.ex")
を試すdefmodule Loop do
def loop(n) do
Enum.each(1..20, fn i ->
:timer.sleep(1_000)
IO.inspect({n, i, str(), __MODULE__.str()}) # local and remote call
end)
__MODULE__.loop(n + 1) # remote and tail-recursive call
end
def str() do
"str/0 version1" # change this and reload!
end
end
loop/1
の末尾再帰のとき
GenServer
など)code_change/3
callbackでデータ移行code_change/3
のデメリットcode_change/3
でデータ移行”もここで指定appup
ファイル群をまとめたもの:release_handler.install_release/2
で取り込む(hot code upgrade):release_handler.upgrade_app/2
で取り込む(hot code upgrade)code_change/3
しない
update
ではなくload_module
を使う単純なappupを生成するツールを自作code_change/3
を使わない理由:init.restart/0
になるcode_change/3
のためにテスト書きたくない
code_change/3
の代替案code_change/3
に相当するコードをhandle_*
の最初に呼び出してデータ移行することもあるGenServer
ばかり書いているとcode_change/3
が目立つが、これが役に立つのは限られた状況のみ