event
를 통해 상태를 전환gen_fsm
(deprecated) 또는 get_statem
gen_fsm
이 deprecated 되어 동기부여마저 떨어짐gen_statem
gen_statem
provides a generic state machine behaviour and replaces its predecessor gen_fsm
since Erlang/OTP 20.0.callback mode
지원gen_statem
으로 진행함pushbutton
moduletrade_fsm
이 너무 어려워서gen_statem
에 나와있는 pushbutton
예제를 사용하기로...
gen_event
event manager
와 handler
는 같은 프로세스에서 실행됨
gen_event:add_sup_handler/3
caller
프로세스가 크래시되면, 등록된 handler
를 자동으로 삭제처리handler
가 삭제되면, caller
프로세스에 자동으로 메시지 전달gen_event
는 gen_server
의 이벤트 처리 특화버전?handler
가 같은 프로세스에서 처리되기 때문에 blocking 에 유의해야 함supervisor
callback
은 init/1
뿐이지만, 가장 복잡한 옵션을 가지고 있는 behaviour 🧙♂️init/1
callback{ok, {{RestartStrategy, MaxRestart, MaxTime}, [ChildSpec]}}
RestartStrategy
one_for_one, one_for_all, rest_for_one, simple_one_for_one
ChildSpec
[{id, MFA, restart, shutdown, type, modules}, ...]
erlang 의 supervisor
는 실행 이후 child process 를 추가 / 삭제 가능
Supervisor
와 DynamicSupervisor
를 구분함supervisor
로...1> band_supervisor:start_link(lenient).
{ok,0.709.0>}
2> supervisor:which_children(band_supervisor).
[{keytar,<0.713.0>,worker,[musicians]},
{drum,<0.715.0>,worker,[musicians]},
{bass,<0.711.0>,worker,[musicians]},
{singer,<0.710.0>,worker,[musicians]}]
ppool
gen_server
, supervisor
를 활용해서 뭔가 쓸모있는 것을 만들기 시작함앱에 필요한 state 를 타입별로 나눠보면, supervision tree 를 구성하는데 도움을 받을 수 있다.
static state
➡️ supervisordynamic state (can recompute)
➡️ other process, db, envdynamic state (cannot recompute)
➡️ other process (gen_server??)ppool
's supervision tree{"src/*", [debug_info, {i,"include/"}, {outdir, "ebin/"}]}.
{"test/*", [debug_info, {i,"include/"}, {outdir, "ebin/"}]}.
{application, ppool,
[{vsn, "1.0.0"},
{modules, [
ppool,
ppool_serv,
ppool_sup,
ppool_supersup,
ppool_worker_sup
]},
{registered, [ppool]},
{mod, {ppool, []}}
]}.
각 OTP 앱을 관리하는 application master 를 시작
ppool
앱도 application master 에서 시작됨