際際滷

際際滷Share a Scribd company logo
gen_server
亠于亠 于仆亳 亠于亠舒
豫舒 仍仂弍舒 亟仍 Belarus Erlang User Group
亠 亳亰舒仍亳, 于亠 亰仆舒ム, 于亠 亳仗仂仍亰ム.
仂仆亳仄舒仆亳亠 亠弍亠 仆亠从仂仂 亳仍亳亶.
丼仂弍 仗仂仆, 仍亠 于亠亞仂
仆舒仗亳舒 gen_server 舒仄仂仄 :)
仗亳舒仆 于仂-于亠 从仆亳亞舒 仗仂 Erlang
亢仂 仄仂仆亞 Programming Erlang, 16- 亞仍舒于舒
个亠亟 丱亠弍亠 LYSE, 亞仍舒于舒 What is OTP?
舒亰仂于亶 仗舒亠仆 OTP
supervisor, gen_event, gen_fsm
亠舒仍亳亰仂于舒仆 舒仆舒仍仂亞亳仆仂,
仆仂 亰从仂 仗亠亳舒仍亳亰亳仂于舒仆仆.
亳仍仂亢亠仆亳亠 stdlib
/usr/local/lib/erlang/lib/stdlib-1.19.4
gen_server
http://www.erlang.org/doc/man/gen_server.html
proc_lib
http://www.erlang.org/doc/man/proc_lib.html
sys
http://www.erlang.org/doc/man/sys.html
gen
仆亠 亟仂从仄亠仆亳仂于舒仆
gen_server:start_link(...)
gen_server:call(...)
gen_server:cast(...)
gen_server API
start_link/3, start_link/4,
start/3, start/4
Callback 仆从亳亳
init
弍仍仂从亳亠 仂亟亳亠仍从亳亶 仗仂亠
timeout = infinity
亟仂仍亢仆舒 弍 仍亠亞从仂于亠仆仂亶
仆亠 亟仂仍亢仆舒 从舒亳 :)
Callback 仆从亳亳
init
仂仍仂亢亠仆仆舒 亳仆亳亳舒仍亳亰舒亳, 于舒亳舒仆 1
init(Args) ->
State = ...
self() ! heavy_init,
{ok, State}.
handle_info(heavy_init, State) ->
NewState = ...
{noreply, NewState};
Callback 仆从亳亳
init
仂仍仂亢亠仆仆舒 亳仆亳亳舒仍亳亰舒亳, 于舒亳舒仆 2
init(Args) ->
State = ...
{ok, State, 0}.
handle_info(timeout, State) ->
NewState = ...
{noreply, NewState};
Callback 仆从亳亳
handle_call
8 于舒亳舒仆仂于 仂于亠舒
Callback 仆从亳亳
{reply, Reply, NewState}
{reply, Reply, NewState, Timeout}
{reply, Reply, NewState, hibernate}
{noreply, NewState}
{noreply, NewState, Timeout}
{noreply, NewState, hibernate}
{stop, Reason, Reply, NewState}
{stop, Reason, NewState}
Callback 仆从亳亳
handle_call(...) ->
gen_server:reply(From, Reply),

{noreply, NewState}
Callback 仆从亳亳
handle_cast, handle_info
4 于舒亳舒仆舒 仂于亠舒
Callback 仆从亳亳
{noreply, NewState}
{noreply, NewState, Timeout}
{noreply, NewState, hibernate}
{stop, Reason, NewState}
Callback 仆从亳亳
format_status
仂仄亳亠 crash report
Callback 仆从亳亳
[{data, [{"State", State}]}],
[{data, [{"State",
get_important_part_of(State)}]},
Timeout & hibernate
init
handle_call
handle_cast
handle_info
Timeout & hibernate
init(Args) ->
State = ...,
{ok, State, 5 * 60 * 1000}.
handle_info(timeout, State) ->
io:format("~p no messages", [?MODULE]),
{noreply, State, hibernate}.
Timeout & hibernate
Hibernate
仂亠 亰舒仆亳仄舒亠 仄亳仆亳仄仄 仗舒仄亳:
- 仂弍舒于舒亠 亠从
- 仗仂于仂亟亳 弍仂从舒 仄仂舒
- 亟亠舒亞仄亠亳亠 从舒
Timeout & hibernate
Hibernate
仂亠 亠亟从仂 仗仂仍舒亠 仂仂弍亠仆亳,
弍仂仍 舒 于亠仄亠仆亳
仗仂于仂亟亳 于 仂亢亳亟舒仆亳亳.
仍舒亟从舒  仗仂仄仂 sys
> sys:trace(e_prof, true).
ok
> e_prof:add_action("some", 5).
*DBG* e_prof got cast {add_action,"some",5}
*DBG* e_prof new state {state,[{action_accum,[115,111,109,101],[5]}],
[{action_stat_set,{16,15,4},[]},{action_stat_set,{16,14,4},[]},
{action_stat_set,{16,13,4},[]},{action_stat_set,{16,12,4},[]},
{action_stat_set,{16,11,4},[]}]}
ok
> e_prof:add_action("some", 15).
*DBG* e_prof got cast {add_action,"some",15}
*DBG* e_prof new state {state,[{action_accum,[115,111,109,101],
[15,5]}],[{action_stat_set,{16,15,4},[]},{action_stat_set,{16,14,4},
[]},{action_stat_set,{16,13,4},[]},{action_stat_set,{16,12,4},[]},
{action_stat_set,{16,11,4},[]}]}
ok
> sys:trace(e_prof, false).
ok
sys:trace(Name, Flag)
仍舒亟从舒  仗仂仄仂 sys
> sys:statistics(e_prof, true).
ok
> sys:statistics(e_prof, get).
{ok,[{start_time,{{2014,6,18},{16,14,43}}},
{current_time,{{2014,6,18},{16,17,10}}},
{reductions,360},
{messages_in,5},
{messages_out,0}]}
> sys:statistics(e_prof, false).
ok
sys:statistics(Name, Flag)
仍舒亟从舒  仗仂仄仂 sys
> sys:get_state(e_prof).
{state,[],
[{action_stat_set,{16,21,4},[]},
{action_stat_set,{16,20,4},[]},
{action_stat_set,{16,19,4},[]},
{action_stat_set,{16,18,4},[]},
{action_stat_set,{16,17,4},[]}]}
sys:get_state(Name) -> State
仍舒亟从舒  仗仂仄仂 sys
> sys:get_status(e_prof).
{status,<0.136.0>,
{module,gen_server},
[[{'$ancestors',[e_prof_sup,<0.134.0>]},
{'$initial_call',{e_prof,init,1}}],
running,<0.135.0>,
[{statistics,{{{2014,6,18},{16,14,43}},
{reductions,3590}, 4,0}}],
[{header,"Status for generic server e_prof"},
{data,[{"Status",running},
{"Parent",<0.135.0>},
{"Logged events",[]}]},
{data,[{"State", {state,[],
[{action_stat_set,{16,16,4},
[{action_stat,"some",10.0,15,...}]},
{action_stat_set,{16,15,4},[]},
{action_stat_set,{16,14,4},[]},
{action_stat_set,{16,13,4},[]},
{action_stat_set,{16,12,...},[]}]}}]}]]}
sys:get_status(Name) -> Status
仗亳仄亳亰舒亳 仗仂亳亰于仂亟亳亠仍仆仂亳
亠仄 仆舒仄 仂亠 亰仆舒,
亞亟亠 亳 从舒从 仄仂亢仆仂 仗仂舒亳 gen_server,
仂弍 舒弍仂舒仍仂 弍亠亠 :)
仗亳仄亳亰舒亳 仗仂亳亰于仂亟亳亠仍仆仂亳
亳从 丱仂亞亠仆 (Lo誰c Hoguin)
仂仆仂于舒亠仍 从仂仄仗舒仆亳亳 99s 亳 舒于仂 Cowboy
亟仂从仍舒亟 仆舒 Erlang Factory 2013
Beyond OTP
仗亳仄亳亰舒亳 仗仂亳亰于仂亟亳亠仍仆仂亳
丐舒从 仂 仄仂亢仆仂 亟亠仍舒  gen_server?
仗亳仄亳亰舒亳 仗仂亳亰于仂亟亳亠仍仆仂亳
丐舒从 仂 仄仂亢仆仂 亟亠仍舒  gen_server?
- 弍舒 仗仂亟亟亠亢从 亟舒仍亠仆仆 亰仍仂于
仗亳仄亳亰舒亳 仗仂亳亰于仂亟亳亠仍仆仂亳
丐舒从 仂 仄仂亢仆仂 亟亠仍舒  gen_server?
- 弍舒 仗仂亟亟亠亢从 亟舒仍亠仆仆 亰仍仂于
- 弍舒 proc_lib:sync_wait 亳 {ack, Pid, Result}
仗亳仄亳亰舒亳 仗仂亳亰于仂亟亳亠仍仆仂亳
丐舒从 仂 仄仂亢仆仂 亟亠仍舒  gen_server?
- 弍舒 仗仂亟亟亠亢从 亟舒仍亠仆仆 亰仍仂于
- 弍舒 proc_lib:sync_wait 亳 {ack, Pid, Result}
- 弍舒 仂弍舒弍仂从 亳从仍ム亠仆亳亶 try...catch
仗亳仄亳亰舒亳 仗仂亳亰于仂亟亳亠仍仆仂亳
丐舒从 仂 仄仂亢仆仂 亟亠仍舒  gen_server?
- 弍舒 仗仂亟亟亠亢从 亟舒仍亠仆仆 亰仍仂于
- 弍舒 proc_lib:sync_wait 亳 {ack, Pid, Result}
- 弍舒 仂弍舒弍仂从 亳从仍ム亠仆亳亶 try...catch
- 弍舒 monitor/demonitor
仗亳仄亳亰舒亳 仗仂亳亰于仂亟亳亠仍仆仂亳
丐舒从 仂 仄仂亢仆仂 亟亠仍舒  gen_server?
- 弍舒 仗仂亟亟亠亢从 亟舒仍亠仆仆 亰仍仂于
- 弍舒 proc_lib:sync_wait 亳 {ack, Pid, Result}
- 弍舒 仂弍舒弍仂从 亳从仍ム亠仆亳亶 try...catch
- 弍舒 monitor/demonitor
- 仆亠 仗仂亟亟亠亢亳于舒 Timeout 亳 hibernate
仗亳仄亳亰舒亳 仗仂亳亰于仂亟亳亠仍仆仂亳
仂亢仆仂 仆舒 10-20% 于亠仍亳亳 仗仂亳亰于仂亟亳亠仍仆仂,
仗仂亢亠于仂于舒于 仆舒亟亠亢仆仂.
仗亳仄亳亰舒亳 仗仂亳亰于仂亟亳亠仍仆仂亳
弌仂亳 仂仆仂 仂亞仂?
仍亳 亟舒, 仂 亳舒亶亠 仗仂 special processes
于 亟仂从仄亠仆舒亳亳, 仄仂亳亠 仗亳仄亠
亳 亟亠仍舒亶亠
Special processes
舒 仆亳 仗仂仂亠仆舒 亳仆舒从舒 OPT
gen_server, gen_*, supervisor  仂 于亠 仂仆亳
c仂亰亟舒ム 亠亠亰 proc_lib:start_link
Special processes
丱舒仆 亳仆 仂 仂亟亳亠仍从亳 仗仂亠舒
仗仂亟亟亠亢亳于舒ム 仂仍舒亟从 亠亠亰 sys
仂于亠舒ム 仆舒 亳亠仄仆亠 仂仂弍亠仆亳
亠从仂仄亠仆亟舒亳亳 仗仂 gen_server
init 亟仂仍亢亠仆 弍 仗仂仄 亳 弍仄
礀亠仍 亳仆亳亳舒仍亳亰舒亳 亟亠仍舒亠仄 仂仍仂亢亠仆仂
仆亠 从舒亳仄 :)
亠从仂仄亠仆亟舒亳亳 仗仂 gen_server
catch all 亟仍 于亠 handle_call,
handle_cast, handle_info
仗亳亠仄 于 仍仂亞 于仄亠仂 仂亞仂,
仂弍 从舒亳 亳 亠 仂仂礌亳亠
亠从仂仄亠仆亟舒亳亳 仗仂 gen_server
亳亰弍亠亞舒亠仄 timeout = infinity
仂 亰舒亟仆磳 亟亳舒亞仆仂亳从 dead lock
亠从仂仄亠仆亟舒亳亳 仗仂 gen_server
亳仗仂仍亰亠仄 call 仂仍从仂 从仂亞亟舒
亟亠亶于亳亠仍仆仂 仆亢亠仆 仂于亠
cast 弍亠亠 亳 仆亠 弍仍仂从亳亠
从仍亳亠仆从亳亶 仗仂亠
亠从仂仄亠仆亟舒亳亳 仗仂 gen_server
my_server ! Msg
handle_info(Msg, State)
仗仍仂仂亶 亳仍
亠从仂仄亠仆亟舒亳亳 仗仂 gen_server
init  从仂仆从仂
terminate  亟亠从仂
仂于仂弍仂亢亟舒亶亠 亠
亟舒亶亠 terminate 亟仂舒仂仆仂 于亠仄亠仆亳
亠从仂仄亠仆亟舒亳亳 仗仂 gen_server
-spec 亟仍 handle_*
亞仂仄仂亰亟从亳亶 亳 仆亠 仆亢仆亶
仆亠 仗仂仄仂亞舒亠 仆亳 从舒从 亟仂从仄亠仆舒亳
仆亳 从舒从 仂仗仂舒 亟仍 dialyzer
亠从仂仄亠仆亟舒亳亳 仗仂 gen_server
-spec 亟仍 handle_*
仆仂 亠仍亳 仂亳亠,
仂  仄亠仆 亠 亟仂弍仆仂亠 亠亠仆亳亠 :)
仂仗仂?
仂亶 弍仍仂亞
yzh44yzh.by

More Related Content

Gen server