七周七语言:Erlang Day 3

Erlang的重头戏来了--并发。还记得那句让人记忆深刻的话么:“就让他崩溃吧”。

  • 找可以在进程终止时重启它的OTP服务。

    Erlang Doc 中可以看到OTP监督行为(Supervisor Behaviour)中的3种重启策略(Restart Strategy),翻译如下:

    1. one_for_one

      如果一个子进程终止了,那么只有那个终止的进程会被重启。

    2. one_for_all

      如果一个子进程终止了,那么所有同一级别的子进程都会被终止并且重启(包含那个终止的子进程)。

    3. rest_for_one

      如果一个子进程终止了,那么子进程集合中的“rest”部分--如终止的子进程之后的进程都会都会被终止并且重启。

    当然,关于重启服务的还有包括:最大重启频率、子进程规范等。该Doc中也给出了一个完整的例子

    -module(ch_sup).
    -behaviour(supervisor).
    
    -export([start_link/0]).
    -export([init/1]).
    
    start_link() ->
        supervisor:start_link(ch_sup, []).
    
    init(_Args) ->
        {ok, {{one_for_one, 1, 60},
              [{ch3, {ch3, start_link, []},definitively
                permanent, brutal_kill, worker, [ch3]}]}}.
    		  
  • 找构建简单的OTP服务器的文档

    Erlang/OTP gen_server
  • 监视translate_service,并在它终止时重启它
    translate_service是在之前的时候写的一个并发程序,使用的是同步消息的机制。

    这里用到的就是OTP中的supervisor,用来监督子进程,而init(_)即是supervisor的回调函数。

    -module(translate_service).
    -behaviour(supervisor).
    -export([loop/0, translate/1]).
    -export([start/0]).
    -export([init/1]).
    -export([start_service/0]).
    
    loop() ->
       receive
          {From, "casa"} ->
             From ! "house",
             loop();
          {From, "blanca"} ->
             From ! "white",
             loop();
          % If the Word is not recognized, shutdown the process.
          {From, M} ->
             From ! "I don't understand.",
             exit({M, " Not Understand!"})
    end.
    
    % Add an atom(translator) to do the translation
    translate(Word) ->
       translator ! {self(), Word},
       receive
          Translation -> Translation
       end.
    
    start() ->
       io:format("Start translating program~n"),
       register(translator, spawn_link(translate_service, loop, [])),
       {ok, whereis(translator)}.
    
    % CALL BACK function
    init(_) ->
       {ok, {{one_for_one, 1, 60 },
       		      [{translate_service, {translate_service, start, []},
    			      permanent, brutal_kill, worker, [translate_service]}]}}.
    
    % Use the supervisor to monitor the service and keep it running.
    start_service() ->
       io:format("Start service~n"),
       supervisor:start_link(translate_service, []).
    		

这一天的内容只完成了一个translate_service的supervisor,感觉还是对OTP里的内容的不了解。
Erlang的并发的强大之处恐怕也不止只是在可以很快的通过重启服务来做到“Let is crash”;其实Erlang的并发原语只有三个:spawn(create process), receive, !(send message, same as Scala),但是通过OTP这个“企业级”的库,却有着可以构建各式各样应用的函数;有点让人不快的是,习惯了一些语言之后,再来看Erlang那行末的", . ;"就会感觉很不适,其实感觉可以将这些不必要的终结符移除的;如果以后有机会的话应该还是会接触到Erlang这门为并发而生的语言。

参考:

转载于:https://www.cnblogs.com/iceCream/archive/2013/01/28/2880195.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值