erlang面试

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hanliangxiaochou/article/details/75012478

erlang四大行为模式

gen_server

方法

  1. start
  2. handle_call(同步)
  3. handle_cast(异步)
  4. handle_info(接收”!”发送的消息)(处理其他信息)
  5. terminate
  6. code_change

gen_fsm

当前状态S,发生事件E,会执行方法A,最终当前状态会改变为S’

State(S) x Event(E) -> Actions(A), State(S')

方法

  1. start
  2. handle_event(异步)(对应的是gen_fsm:send_event调用)(或者gen_fsm:send_all_state_event)
  3. handle_sync_event(同步)(对应的是gen_fsm:sync_send_all_state_event的调用)
  4. handle_info
  5. terminate
  6. code_change

gen_event

一个可以自定义的事件管理器,没有用过,类似gen_fsm的可配置化版

supervisor

监督树,一个监督者进程下面会像树一样有很多的子进程,监督者会监控它们的死亡,以及死亡后的重启方式

重启方式有以下几种

  1. one_for_one
    假如该模式下的子进程死亡了,监督者会重新启动该子进程
  2. one_for_all
    假如该模式下的子进程死亡了,监督者会重新启动监督者管辖下的所有子进程
  3. rest_for_one
    假如该模式下的子进程死亡了,监督者会重新启动配置里面这个进程后面的所有子进程
  4. simple_one_for_one
    假如该模式下的子进程死亡了,监督者会重新启动该子进程

one_for_one 与 simple_one_for_one

  1. one_for_one子进程随监督树启动而启动
  2. simple_one_for_one需要手工start_child,因为监督树启动的时候并没有启动子进程,这样更便于动态管理,可以随时启动
  3. one_for_one的子进程启动会按照配置的顺序,simple_one_for_one没有任何顺序
  4. 同样的是,都会随监督树的死亡而死亡

定时器

timer

不管在何处调用timer,timer都是由一个单进程维护的,用的过多时,会导致压力增大,而且该进程挂掉了,其他的就全完了

gen_server实现定时

%%gen_server:部分call_back function.
-define(TIME,1000).
init([]) ->  
    {ok, #state{}, ?TIME}.
handle_info(Info, State) -> 
    io:format("timeout 1seconds .. ~p~n",[Info]), 
    {noreply, State, ?TIME}.

1秒后会超时,调用handle_info,无限循环调用handle_info,Info为’timeout’

send_after

erlang:send_after是BIF函数,它们把计时器附着在进程自己身上,so尽量使用erlang:send_after函数吧

start and start_link

  • start创建的进程是一个独立的gen_server进程
  • start_link创建的进程是监控进程的子进程,有link关系
  • 类似的有spawn和spawn_link,spawn_link=spawn+link

猜你喜欢

转载自blog.csdn.net/hanliangxiaochou/article/details/75012478
今日推荐