supervisor是erlang的一个行为框架,他的工作重心在于管理和监督我们启动的进程,并对所有进程安排一定的策略
把上回关于app的代码直接拿来用一下,然后我们对map_sup.erl增加一些新的东西进去,上次我们只是写了简单的启动模式,
-module(map_sup).
-behaviour(supervisor).
-export([start_link/0, init/1]).
start_link()->
supervisor:start_link({local,?MODULE}, ?MODULE, []).
init([]) ->
erlang:process_flag(priority, high),
MapManager = {map_manager,{map_manager,start_link,[]},
permanent,2000,worker,[map_manager]},
List = [MapManager],
{ok,{{one_for_one,1000,2}, [MapManager]}}.
MapManager 中的参数中指定了map_manager这个module,我们简单写一下map_manager(这个文件的作用是管理进程,包括了进程的创建和停止等对进程的详细操作)。这里我们使用otp中最常用的行gen_server,otp(Open telecom platform,请记住全称)
-module(map_manager).
-behaviour(gen_server).
-export([start_link/0]).
-export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2]).
start_link()->
gen_server:start_link({local,?MODULE},?MODULE,[],[]).%%这就是gen_server启动一个进程的方式
init([]) ->
self() ! begin_map,
{ok, #state{}}.
handle_info(begin_loading_map, State) ->
{noreply, State};
handle_info(Event, State) ->
?ERRMSG("receive unknown message:~p~n", [Event]),
{noreply, State}.
handle_call(Event, _From, State) ->
{reply, Reply, State};
handle_call(_Request, _From, State) ->
Reply = ok,
{reply, Reply, State}.
handle_cast(_Msg, State) ->
{noreply, State}.
terminate(_Reason, _State) ->
ok.
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
这里我还没想好要写些什么来测试,当我们start_link的时候我们要为我们这个进程配置一些参数,或者说,我们的进程要有一个状态才能去完成我们的逻辑,所以init方法就是初始化一个进程的方法,每次调用start_link,init都会按照需要来初始化一个进程,这里我们会吧ets放到进程中,这就是一个基础的框架,明天想想再来扩展一下.