「アーラン/ OTP並行プログラミング戦闘」第IV章OTPアプリケーションと監督メカニズム

  1. アーラン/ OTPアプリケーションディレクトリのレイアウト:
    1. ドキュメントは、
      ドキュメントを格納するために使用されます。文書がEDOC生成意志のoverview.edoc文書がここにある場合は、ファイルの残りの部分は自動的に生成されます。
    2. ebin
      コンパイルされたコードを格納します。アプリケーションのメタデータを含むの.appファイルはここに格納されなければなりません。
    3. 含ま
      公共のヘッダファイルを格納するために使用されます。
    4. PRIVは、
      必要なアプリケーションと一緒に発表され、他のさまざまなコンテンツを格納するために使用されます。含むがこれにテンプレートファイル、共有オブジェクトファイル、DLLに限定されるものではありません。
      コード:priv_dir(<アプリケーション名 >) 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 ビュー10000 +

おすすめ

転載: blog.csdn.net/sanmao123456_/article/details/103420173