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 可以用来改变服务器的状态。
erlang随笔3--OTP的更多相关文章
- Erlang/OTP设计原则(文档翻译)
http://erlang.org/doc/design_principles/des_princ.html 图和代码皆源自以上链接中Erlang官方文档,翻译时的版本为20.1. 这个设计原则,其实 ...
- [Erlang 0107] Erlang实现文本截断
抽时间处理一下之前积压的一些笔记.前段时间有网友 @稻草人 问字符串截断的问题"各位大侠 erlang截取字符串一般用哪个函数啊",有人支招用string:substr/3, ...
- erlang note
没有关于erlang interface ,继续寻找吧... --------------------------------------------------------------- erl - ...
- Erlang基础 -- 介绍 -- 历史及Erlang并发
前言 最近在总结一些Erlang编程语言的基础知识,拟系统的介绍Erlang编程语言,从基础到进阶,然后再做Erlang编程语言有意思的库的分析. 其实,还是希望越来越多的人关注Erlang,使用Er ...
- Erlang学习记录:相关工具和文档
在线工具和文档 网址 说明 OTP Reference Page Index 内置模块查询 Erlang/OTP Applications N Kernel Reference Manual 入门官方 ...
- Elixir - Hey, two great tastes that go great together!
这是Elixir的作者 José Valim 参与的一次技术访谈,很有料,我们可以了解Elixir的一些设计初衷,目标等等. 原文在: http://rubyrogues.com/114-rr-eli ...
- 再写一篇ubuntu服务器的环境配置文
三年前写过一篇,但是环境和三年前比已经发生了比较大的变化,于是重新写一篇,自己以后再次配置也比较方便.我个人而言并没有觉得centos比ubuntu好用多少,所以继续选用ubuntu. 一.硬盘分区 ...
- 番外篇:搭建Windows环境下的RabbitMQ环境
搭建Windows环境下的Rabbitmq环境 下载erlang语言包OTP.官网地址: https://www.erlang.org/downloads 如果下载不了,可以选择百度网盘下载,里面的版 ...
- [Erlang 0127] Term sharing in Erlang/OTP 上篇
之前,在 [Erlang 0126] 我们读过的Erlang论文 提到过下面这篇论文: On Preserving Term Sharing in the Erlang Virtual Machine ...
随机推荐
- [GO]百度贴吧的爬虫
package main import ( "fmt" "strconv" "net/http" "os" " ...
- ObjC正则表达式验证
试过ObjC的regkit这个框架. 也用过内置的正则表达式验证. 最后发现有个非常简单的方法就可以做到验证正则表达式.那就是NSPredicte这个类提供的方法. 这里有验证邮箱地址的正则为例: N ...
- ACM 韩信点兵 、n的另一种阶乘、6174的问题
3.6174问题 描述 假设你有一个各位数字互不相同的四位数,把所有的数字从大到小排序后得到a,从小到大后得到b,然后用a-b替换原来这个数,并且继续操作.例如,从1234出发,依次可以得到4321- ...
- iOS设计模式之单例
单例模式的意思就是这个类只有一个实例,这个类就是单例类.在iOS中有不少都是单例NSNull,NSFileManager ,UIApplication,NSUserDefaults ,UIDevice ...
- CodeForces 907E Party(bfs+状压DP)
Arseny likes to organize parties and invite people to it. However, not only friends come to his part ...
- centos 7防火情配置
查看版本 firewall-cmd --version 2 查看指定端口是否开放 firewall-cmd --query-port=端口号/tcp 3 开放指定端口(--permanent表示永久, ...
- ThinkJS 中的Logic层
第一个为什么需要Logic层: 当在 Action 里处理用户的请求时,经常要先获取用户提交过来的数据,然后对其校验,如果校验没问题后才能进行后续的操作:当参数校验完成后,有时候还要进行权限判断等,这 ...
- 14、Semantic-UI之菜单样式
14.1 基础菜单样式 在Semantic-UI中使用class="ui menu". 示例:定义基础菜单样式 <div class="ui menu" ...
- HDU 1496
题目出处:HDU OJ 1496 http://acm.hdu.edu.cn/showproblem.php?pid=1496 为了练习Hash,特定采用了杭电自带的分类列表http://acm.hd ...
- [Erlang16]为什么要用MFA代替fun()–>end?
MFA:Module Function Arguments. 首先你要知道Module:Func(Args)和Func(Args)的区别在哪里? 如果对细节感兴趣,可以通过这里了解:http://ww ...