gen_server
เอกสารประกอบใน Module:terminate
โทรกลับพูดว่า:
แม้ว่ากระบวนการ gen_server จะไม่ได้เป็นส่วนหนึ่งของแผนผังการควบคุมดูแล แต่ฟังก์ชันนี้จะถูกเรียกใช้หากได้รับข้อความ 'EXIT' จากผู้ปกครอง เหตุผลเหมือนกับในข้อความ 'EXIT'
นี่คือฟังก์ชัน handle_info
และ terminate
ของฉัน:
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]).
ฉันเริ่มเซิร์ฟเวอร์นี้โดยใช้ gen_server:start
ฉันคิดว่าเมื่อฉันโทร erlang:exit(Pid, fuckoff)
มันควรจะเรียกใช้ฟังก์ชันการโทรกลับ terminate
แต่มันแสดงให้เห็นว่า:
Got unknown message: {'EXIT',<0.33.0>,fuckoff}
ซึ่งหมายความว่ากำลังโทร handle_info
แต่เมื่อฉันโทร gen_server:stop
ทุกอย่างทำงานได้ตามที่กล่าวไว้ในเอกสารประกอบ ฉันกำลังเรียก gen_server
ของฉันจากเชลล์ คุณช่วยชี้แจงเรื่องนี้หน่อยได้ไหม?
[อัปเดต]
ที่นี่ คือซอร์สโค้ดของฟังก์ชัน decode_msg
ภายใน gen_server
หากได้รับข้อความ 'EXIT' ควรเรียกใช้ฟังก์ชัน 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.
ในกรณีของฉัน มันไม่เรียกใช้ฟังก์ชัน terminate
[อัปเดต]
เมื่อฉันเริ่ม gen_server
โดยใช้ gen_server:start_link()
การส่งสัญญาณออกโดยใช้ erlang:exit(Pid, Reason)
จะส่งผลให้มีการเรียกฟังก์ชันโทรกลับ terminate
ซึ่งเป็นลักษณะการทำงานที่คาดไว้ ดูเหมือนว่ามีความแตกต่างในการตีความสัญญาณทางออกไม่ว่ากระบวนการจะเชื่อมโยงกับพาเรนต์หรือไม่ก็ตาม
trap_exit
ของกระบวนการเป็นtrue
ที่ไหนสักแห่งในโค้ดหรือไม่ - person Hamidreza Soleimani   schedule 25.09.2016init
- person Majid Azimi   schedule 25.09.2016