gen_server
dokumentasi pada Module:terminate
panggilan balik mengatakan:
Meskipun proses gen_server bukan bagian dari pohon pengawasan, fungsi ini dipanggil jika menerima pesan 'EXIT' dari induknya. Alasannya sama seperti pada pesan 'EXIT'.
Inilah fungsi handle_info
dan terminate
saya:
handle_info(UnknownMessage, State) ->
io:format("Got unknown message: ~p~n", [UnknownMessage]),
{noreply, State}.
terminate(Reason, State) ->
io:format("Terminating with reason: ~p~n", [Reason]).
Saya memulai server ini menggunakan gen_server:start
. Saya berasumsi ketika saya memanggil erlang:exit(Pid, fuckoff)
, itu harus memanggil fungsi panggilan balik terminate
. Tapi itu menunjukkan:
Got unknown message: {'EXIT',<0.33.0>,fuckoff}
Artinya ia memanggil handle_info
. Namun ketika saya menelepon gen_server:stop
, semuanya berfungsi seperti yang disebutkan dalam dokumentasi. Saya menelepon gen_server
saya dari shell. Bisakah Anda menjelaskan hal ini?
[PEMBARUAN]
Berikut adalah kode sumber fungsi decode_msg
di dalam gen_server
. Jika menerima pesan 'EXIT', ia harus memanggil fungsi terminate
:
decode_msg(Msg, Parent, Name, State, Mod, Time, Debug, Hib) ->
case Msg of
{system, From, Req} ->
sys:handle_system_msg(Req, From, Parent, ?MODULE, Debug,
[Name, State, Mod, Time], Hib);
{'EXIT', Parent, Reason} ->
terminate(Reason, Name, Msg, Mod, State, Debug);
_Msg when Debug =:= [] ->
handle_msg(Msg, Parent, Name, State, Mod);
_Msg ->
Debug1 = sys:handle_debug(Debug, fun print_event/3,
Name, {in, Msg}),
handle_msg(Msg, Parent, Name, State, Mod, Debug1)
end.
Dalam kasus saya, ini tidak memanggil fungsi terminate
.
[PEMBARUAN]
Saat saya memulai gen_server
menggunakan gen_server:start_link()
, mengirimkan sinyal keluar menggunakan erlang:exit(Pid, Reason)
akan menghasilkan pemanggilan fungsi panggilan balik terminate
yang merupakan perilaku yang diharapkan. Tampaknya ada perbedaan dalam menafsirkan sinyal keluar apakah suatu proses terhubung ke induknya atau tidak.
trap_exit
proses ketrue
di suatu tempat dalam kode? - person Hamidreza Soleimani   schedule 25.09.2016init
. - person Majid Azimi   schedule 25.09.2016