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 ...
随机推荐
- CentOS下的Git服务器
[Gitosis]CentOS下的Git服务器:Gitosis [摘要] 详细介绍如何在CentOS上配置Gitosis 我们很多人知道Git可能是从Github开始的 ...
- linux命令的笔记
1.改变目录的用户组和所有者 chown 命令 如下图: 可以看到test1与test2的的所有者和所属组都是root,其中 第三个字段是说明目录拥有者, 第四个字段是文件拥有者所在的组, 第五个字段 ...
- 从零开始学习前端JAVASCRIPT — JavaScript中this指向的四种情况
JavaScript中this的四种情况(非严格模式) 1.当this所在函数是事件处理函数时,this指向事件源.2.当this所在函数是构造函数时,this指向new出来的对象.3.this所在函 ...
- 解剖JavaScript中的null和undefined【转】
在JavaScript开发中,被人问到:null与undefined到底有啥区别? 一时间不好回答,特别是undefined,因为这涉及到undefined的实现原理.于是,细想之后,写下本文,请各位 ...
- Inno Setup 编译器
Inno Setup 编辑 Inno Setup用Delphi写成,其官方网站同时也提供源程序免费下载.它虽不能与Installshield这类恐龙级的安装制作软件相比,但也当之无愧算是后起之秀.In ...
- .Net Core配置与自动更新
.Net Core 将之前Web.Config中的配置迁移到了appsettings.json文件中,并使用ConfigurationBuilder来读取这个配置文件.并可设置在配置文件变化以后,自动 ...
- ZKEACMS 自定义表单的使用
ZKEACMS Core 2.2 已经发布了,其中主要添加了自定义表单的功能.使用自定义表单的功能,您可以在几分钟内就创建一个表单,并用它来收集一些信息.导出收集的信息,就可以做一些统计分析. 创建表 ...
- OOM AutoMapper的简单实用
OOM AutoMapper的简单实用 一.前言: OOM顾名思义,Object-Object-Mapping实体间相互转换,AutoMapper也是个老生常谈了,其意义在于帮助你无需手动的转换简单 ...
- “全栈2019”Java第三十八章:类与方法
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- java 程序设计第一次作业
public class Join{ public static void main(String args[]){ String s1=new String("hello"); ...