zoukankan      html  css  js  c++  java
  • erlang随笔3--OTP

    OTP最核心的概念就是行为。一个行为封装了某种常见的行为模式。可以把这些行为理解为某种应用程序框架。可以通过回调模块来
    定制这些框架。OTP依靠行为引用了容错,扩容和动态代码升级等特性。所以在写回调模块的时候不需要再考虑容错之类的事务。

    new() -> dictionary()
    初始构造一个新的字典(其实是返回一个内部定义的dict记录record)
    store(Key, Value, Dict1) -> Dict2
    以键值(Key - Value)对的形式存储在字典里。如果字典里已经存在 Key 的键,则把跟 Key 相关的值替换为 Value(覆盖)
    from_list(List) -> Dict
    把一个 Key-Value 形式的列表转换为一个字典
    size(Dict) -> int()
    返回字典里键值对的个数
    to_list(Dict) -> List
    把字典转换成一个列表形式
    append(Key, Value, Dict1) -> Dict2
    给当前列表跟 Key 相关联的值附加上一个新值 Value(如果跟 Key 相关联的值不是一个列表值,将会抛出一个异常错误)

    EPL(erlang 公开协议)

    1.原始的服务器程序【server1.erl + name_server.erl】
    2.支持事务的服务器程序:在请求导致服务器程序出现异常时,会让给客户端代码异常退出。通过try catch,如果出现异常,
    就会用之前的状态循环,否则就按照新的状态进行循环。【server2.erl + name_server.erl】
    3.支持热代码替换的服务器程序:添加一个热代码替换的特性:swap_code/2。如果向服务器发送一个替换代码的信息,
    那么服务器程序就会把回调模块换成消息中的新模块,232页设计的很巧妙【server3.erl + name_server1.erl】
    4.同时支持事务和热代码替换的服务器程序:手机照片
    5.写一个空的服务器,然后按照自己想要的服务器程序变成别的服务器程序。如书235的累乘服务器程序。

    写gen_srever回调模块的3个要点:确定好回调模块名称,写接口函数,在回调模块中写需要的6个回调函数
    (init/1,handle_call/3,handle_cast/2,handle_info/2,terminate/2,code_change/3)。
    geb_server模块:是行为的一种。
    gen_server的规约要求module必须实现init方法,

    gen_server:start_link({local,?MODULE},?MODULE,InitArgs,[]):启动一个本地服务器,
    ?MODULE宏展开的时候会对应模块的名称,比如my_bank.第一个参数表示Name,就是服务器程序的名称,第二个参数是模块名称,
    第三个参数是调用init(InitArgs)来启动服务器程序。第四个参数是用来控制服务器程序的行为。
    如(要注意参数一定是列表而不是原子)
    init([State]) ->
    {ok, State}. 服务器的初始状态是State.

    gen_server:call(?MODULE,Term):用来发起对服务器的远程调用。

    handle_call(stop, From, Tab) ->{stop, normal, stopped, Tab}:终止服务器程序的方法。
    normal会作为my_bank:terminate/2的第一个参数,而stopped则会被当做my_bank:stop()的返回值。

    比如要开账户:new_account(Who) ->gen_server:call(?MODULE,{new,Who}).
    handle_call(_Request,_From,_state) ->{reply,Reply,State}.241页
    handle_call(_Request,_From,_state) ->{noreply,State}.
    handle_call(_Request,_From,_state) ->{stop,Reason,Reply,State}.
    这里的Reply值 会作为远程过程调用的返回值发回给发起调用的客户端。
    State是表示全局状态的变量。比如Reply= ok.
    From是客户端进程的PID,如果一切正常的话,我们会返回{reply, Reply, NewState}.这时候Reply会作为gen_server:call的返回值交给客户端,
    而NewState是服务器的新状态。

    handle_cast(Name,Name):表示通知。是一个无返回值的调用,实际上就是发送一个消息。 它只会返回{noreply,NewState},这回改变服务器的状态,也可能返回{stop,...}这会终止服务器。

    handle_info(Info, State) :用来处理发给服务器的原生消息。比如说,如果服务器和其他的进程建立了链接,正在捕获退出信号,那么可能会
    突然收到意外的{‘EXIT’,Pid, What}这样的消息。像这样的消息都会作为Info的值传给回调程序。他的返回值和handle_cast一样。

    terminate(_Reson,State) ->ok. 很多原因会导致服务器终止,比如收到了stop或者{‘EXIT’,reason}.都会调用terminate(Reaon,NewState)函数。
    这个时候的参数state还可以写到磁盘上,以消息的形式发送给另一个进程。或者直接丢弃。如果还要再次启动这个服务器,可以调用rerminate/2来触发I'll be back函数

    code_change/3 可以用来改变服务器的状态。

  • 相关阅读:
    lintcode197- Permutation Index- easy
    lintcode10- String Permutation II- medium
    lintcode211- String Permutation- easy
    lintcode51- Previous Permutation- medium
    lintcode52- Next Permutation- medium
    lintcode108- Palindrome Partitioning II- medium
    lintcode136- Palindrome Partitioning- medium
    lintcode153- Combination Sum II- medium
    lintcode521- Remove Duplicate Numbers in Array- easy
    lintcode135- Combination Sum- medium
  • 原文地址:https://www.cnblogs.com/zacybl/p/10794766.html
Copyright © 2011-2022 走看看