《Erlang/OTP并发编程实战》第四章 OTP 应用与监督机制

  1. Erlang/OTP 应用的目录布局:
    1. doc
      用于存放文档。如果文档是用 EDoc 生成的,将 overview.edoc 文件放在这里,其余文件会自动生成。
    2. ebin
      用于存放编译后的代码。含有应用元数据的 .app 文件也应存放在此处。
    3. include
      用于存放公共头文件。
    4. priv
      用于存放各种需要随应用一起发布的其他内容。包括但不限于模板文件、共享对象文件、DLL 等。
      code:priv_dir(<application-name>) 会返回 priv 目录的完整路径。
    5. src
  2. 构建应用:

    tcp_rpc.app
    {application, tcp_rpc,
        [
            {description, "RPC server for Erlang and OTP in action"},
            {vsn, "0.1.0"},
            {modules, [
                tr_app,
                tr_sup,
                tr_server]},
            {registered, [tr_sup]},
            {applications, [kernel, stdlib]},
            {mod, {tr_app, []}}
        ]
    }.

    tr_app.erl

    -module(tr_app).
    
    -behaviour(application).
    
    %% API
    -export([
        start/2,
        stop/1]).
    
    start(_Type, _StartArgs) ->
        case tr_sup:start_link() of
            {ok, Pid} ->
                {ok, Pid};
            Other ->
                {error, Other}
        end.
    
    %% Type: normal | failover | takeover
    %% StartArgs: .app 文件中传给 mod 的参数
    
    stop(_State) ->
        ok.
    

    tr_sup.erl

    -module(tr_sup).
    
    -behaviour(supervisor).
    
    %% API
    -export([start_link/0]).
    
    -export([init/1]).
    
    -define(SERVER, ?MODULE).
    
    start_link() ->
        supervisor:start_link({local, ?SERVER}, ?MODULE, []).
    
    init([]) ->
        Server = {tr_server, {tr_server, start_link, []},
            permanent, 2000, worker, [tr_server]},
        Children = [Server],
        RestartStrategy = {one_for_one, 0, 1},
        {ok, {RestartStrategy, Children}}.
    
    
    %% 重启策略:{xx, Max, Within} 单位:秒
    %% one_for_one:如果一个子进程终止,仅该进程被重启
    %% one_for_all:如果一个子进程终止,所有子进程被重启
    %% rest_for_one:如果一个子进程终止,在启动顺序上后面的子进程被重启
    %% simple_one_for_one:监督者只能启动一种子进程,但却可以启动任意多个。
    %%                     所有子进程都是运行时动态添加的,监督者本身在启动时不会启动任何子进程。
    
    %% 子进程规范:{ID, Start, Restart, Shutdown, Type, Modules}
    %% Restart:permanent | temporary | transient(仅在进程意外终止时重启进程)
    %% Shutdown:
    %%      软关闭策略,单位:毫秒
    %%      brutal_kill
    %%      infinity:主要用于子进程本身也同为监督者的情况,表示应给予子进程充分的时间自行退出
    
    %% 添加子进程
    %% supervisor:start_child(Sup, ChildSpec)
    %% 如果督程死了,并被重建了,所有动态添加的子进程会丢失
    
    %% 停止子进程
    %% supervisor:terminate_child(Sup, Id).
    
    %% 删除子进程
    %% supervisor:delete_child(Sup, Id).
    
  3. 启动应用:

    erlc -o ebin src/*.erl
    erl -pa ebin        werl -pa ebin(windows)
    application:start(tcp_rpc).
  4. 生成 EDoc 文档:

    edoc:application(tcp_rpc, ".", []).
发布了42 篇原创文章 · 获赞 2 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/sanmao123456_/article/details/103420173