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 可以用来改变服务器的状态。

erlang随笔3--OTP的更多相关文章

  1. Erlang/OTP设计原则(文档翻译)

    http://erlang.org/doc/design_principles/des_princ.html 图和代码皆源自以上链接中Erlang官方文档,翻译时的版本为20.1. 这个设计原则,其实 ...

  2. [Erlang 0107] Erlang实现文本截断

       抽时间处理一下之前积压的一些笔记.前段时间有网友 @稻草人 问字符串截断的问题"各位大侠 erlang截取字符串一般用哪个函数啊",有人支招用string:substr/3, ...

  3. erlang note

    没有关于erlang interface ,继续寻找吧... --------------------------------------------------------------- erl - ...

  4. Erlang基础 -- 介绍 -- 历史及Erlang并发

    前言 最近在总结一些Erlang编程语言的基础知识,拟系统的介绍Erlang编程语言,从基础到进阶,然后再做Erlang编程语言有意思的库的分析. 其实,还是希望越来越多的人关注Erlang,使用Er ...

  5. Erlang学习记录:相关工具和文档

    在线工具和文档 网址 说明 OTP Reference Page Index 内置模块查询 Erlang/OTP Applications N Kernel Reference Manual 入门官方 ...

  6. Elixir - Hey, two great tastes that go great together!

    这是Elixir的作者 José Valim 参与的一次技术访谈,很有料,我们可以了解Elixir的一些设计初衷,目标等等. 原文在: http://rubyrogues.com/114-rr-eli ...

  7. 再写一篇ubuntu服务器的环境配置文

    三年前写过一篇,但是环境和三年前比已经发生了比较大的变化,于是重新写一篇,自己以后再次配置也比较方便.我个人而言并没有觉得centos比ubuntu好用多少,所以继续选用ubuntu. 一.硬盘分区  ...

  8. 番外篇:搭建Windows环境下的RabbitMQ环境

    搭建Windows环境下的Rabbitmq环境 下载erlang语言包OTP.官网地址: https://www.erlang.org/downloads 如果下载不了,可以选择百度网盘下载,里面的版 ...

  9. [Erlang 0127] Term sharing in Erlang/OTP 上篇

    之前,在 [Erlang 0126] 我们读过的Erlang论文 提到过下面这篇论文: On Preserving Term Sharing in the Erlang Virtual Machine ...

随机推荐

  1. java grpc实例分析

    一.Protocol Buffer 我们还是先给出一个在实际开发中经常会遇到的系统场景.比如:我们的客户端程序是使用Java开发的,可能运行自不同的平台,如:Linux.Windows或者是Andro ...

  2. javascript总结25:Array的5中迭代方法: every(), filter() , forEach() map() some()

    1 Array常用的操作方法: 1 操作方法 - concat() //把参数拼接到当前数组 -slice() //从当前数组中截取一个新的数组,不影响原来的数组,参数start从0开始,end从1开 ...

  3. Hadoop分布式模式下SSH免密码登录

    1.Hadoop中为什么要配置免密码登录 最近在学习Hadoop,在集群中,Hadoop控制脚本依赖SSH来执行针对整个集群的操作.例如,某个脚本能够终止并重启集群中的所有守护进程.所以,需要安装SS ...

  4. mysql建外键失败

    1. 修改引擎:(设计表-->选项-->引擎:InnoDB) 2. 检查外键类型是否一致:

  5. Quartus中代码字体大小的调整方法

    Quartus中代码大小的调整方法 网友 "一纸玫瑰"整理 第一步:点击Tools(工具) 第二步:点击Options(选项) 第三步:Text Editor(文本编辑)/Font ...

  6. APUE(8)---进程控制(1)

    一.进程标识 每个进程都有一个非负整型标识的唯一进程ID.因为进程ID标识符总是唯一的,常将其用做其他标识符的一部分以保证其唯一性.进程ID虽然是唯一的, 但是却是可以复用的.ID为0的进程通常是调度 ...

  7. HTML5+CSS3+jQuery Mobile轻松构造APP与移动网站 (陈婉凌) 中文pdf扫描版

    <HTML5+CSS3+jQuery Mobile轻松构造APP与移动网站>以HTML与CSS为主,配合jQuery制作网页,并搭配jQueryMobile制作移动网页,通过具体的范例从基 ...

  8. [LeetCode 题解]: Count and Say

    The count-and-say sequence is the sequence of integers beginning as follows:1, 11, 21, 1211, 111221, ...

  9. [转载].NET商业软件源码保护

    列举工作以来遇到的各种类型的软件所采用的代码保护技术,只讲原理不涉及技术细节实现,以避免产生法律问题.有些朋友说直接把代码放在Github开源下载,开源可以促进技术交流与进步,然而值钱的代码都积压在硬 ...

  10. c#设计模式系列:状态模式(State pattern)

    引言 我们在编程的时候,有时候会遇到,一个对象的行为动作会由对象的状态来决定的,也就是对象的行为是由状态来决定,如果对象的状态很多,那么也会由很多不同的行为,这时候我们一班会 if –else if- ...