erlang 的 application, 我第一次是在工作中接触到的,简写都叫app,那时候还犯糊涂,总和手机app弄错,其实erlang的app就是一堆module的集合,通过app将关联性强的module集合在一起以便于管理和监督指定的进程,以前我一直以为一般的erlang项目的层次结构为 Nodes -> apps -> super ->process就是这样,书上也说过,app就是用来管理进程的,但是我始终还是觉着真正起到管理作用的都是super行为。
之所以想到说说app主要是因为前面还有一个关于进程注册的问题没有解决,一直想知道一个确切的结果!
这里我们假设是在做游戏的场景吧,我们就以map_app.app为例来写一个配置文件,这里的参数我实在是记不住了,参看一一下其他人的写了一点注释
{application, map_app, %%app名称
[{description,"the application which createed the processes of map"},%%描述
{vsn,"2.0"}, %%版本号
{modules,[]}, %%包含的module,写空即可
{registered,[]}, %%使用什么样的进程名
{maxP,Num}, %%进程最大值
{maxT,Time}, %%app运行时间 单位毫秒
{included_applications,[]} %%加载但不启动的子app
{env,[]} %%app的env
{applications,[kernel,stdlib]}, %%依赖的application
{mod,{map_app,[]}} %%app的启动模块和参数
]
}.
下面来写一下加载app的代码
-mdoule(map_app).
-behaviour(application).
-export([
start/2,
stop/1,
start/0
]).
start()->
application:start(?MODULE, permanent).
start(_Type, _StartArgs) ->
{ok, _MapSupPid} = start_map_sup().
stop(_State) ->
ok.
start_map_sup()->
case map_sup:start_link() of
{ok, Pid} ->
{ok, Pid};
Error ->
Error
end.
这里,app的加载,application作为一个行为框架,他会自动加载start/0和start/2,有时间来看看源码是如何操作的,这里我们启动了一个super,作为一个监督进程,也就是管程。用以监督和管理通过其启动的进程
把super的代码也写好
-module(map_sup).
-behaviour(supervisor).
-export([start_link/0, init/1]).
start_link()->
supervisor:start_link({local,?MODULE}, ?MODULE, []).
init([]) ->
{ok,{{one_for_one,1000,2}, []}}.
至此,我们就已经将一个小的application写好了,测试以后就可以开始慢慢扩展程序了。
最近发现,虽然工作中做了不少erlang的东西,可是回过头还是有好多迷糊的地方,这样也好,也能再巩固一下自己的基础,矫正一下学习的方法和态度
明天再把supervisor的东西扩展到下程序中