不,或者可能實際上死亡。
的過程中提到了Pid
可能在Fun
第一行中的錯誤,可以嘗試獲得一些外部資源作爲其第一個動作和 失敗(鎖定的文件,一個不存在的數據庫,等等),它可以很快終止非常無循環等
-module(silly).
-export([do_stuff/0]).
do_stuff() ->
keep_alive(die_bot, fun i_die_fast/0).
i_die_fast() ->
not_ok = io:format("Is this ok?~n"),
receive Anything ->
ok = io:format("Received: ~tp~n", [Anything]),
i_die_fast()
end.
keep_alive(Name, Fun) ->
register(Name, Pid = spawn(Fun)),
on_exit(Pid, fun(_Why) -> keep_alive(Name, Fun) end).
如何將上面的代碼打出來的? (io:format/1
始終返回ok
,所以它不會匹配not_ok
並在第一行中崩潰。)i_die_fast/0
似乎永久遞歸,但它永遠不會那麼遠,並且可能會在達到on_exit/2
之前死亡。 (但它不是保證死之前on_exit/2
被稱爲!歡迎併發。)
關鍵是你不知道。最接近你可以知道的是使用spawn_link
,或者在較少耦合的情況下使用spawn
,然後使用monitor
或spawn_monitor
。
競爭狀態與register
是真實的,以及和可能崩潰當前執行的過程 - 所以這是競爭條件。
旁註:
這就是爲什麼我幾乎總是有這樣,如果有衝突,它在孩子,而不是調用的情況下炸燬衍生功能寄存器本身(在大多數情況下,有各種各樣的原因爲什麼你可能想以另一種方式做):
% Note, we don't need the PID of `some_helper` because it is named.
start() ->
_ = spawn_link(fun() -> some_helper() end),
main_loop().
some_helper() ->
true = register(helper, self()),
helper_loop().