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 ...
随机推荐
- jQuary总结2: jQuery选择器
1 什么是jQuery选择器 获取页面元素,并且把页面元素包装成jQuery对象的方式 2 为什么要学习jQuery选择器 为了更加方便的获取页面上的元素,并且将元素包装起来,使我们编写程序时更加便 ...
- mybatis 存储过程调用
接口 UserInfoMapper.java xml UserInfoMapper.xml 如何关联 <?xml version="1.0" encoding=" ...
- (自己转)比较ArrayList、LinkedList、Vector
1. List概述 List,就如图名字所示一样,是元素的有序列表.当我们讨论List时,将其与Set作对比是一个很好的办法,Set集合中的元素是无序且唯一的.下图是Collection的类继承图,从 ...
- [Lua快速了解一下]Lua的model
我们可以直接使用require(“model_name”)来载入别的lua文件,文件的后缀是.lua.载入的时候就直接执行那个文件了.比如: 我们有一个hello.lua的文件: print(&quo ...
- sheel远程执行
https://www.cnblogs.com/softidea/p/6855045.html shell远程执行: 经常需要远程到其他节点上执行一些shell命令,如果分别ssh到每台主机上再去执行 ...
- hive(在大数据集合上的类SQL查询和表)学习
1.jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true&characterEncoding=UTF-8&use ...
- sql 的REPLACE
REPLACE 用第三个表达式替换第一个字符串表达式中出现的所有第二个给定字符串表达式. 语法 REPLACE ( 'string_expression1' , 'string_expression2 ...
- Oracle数据表转换为Shapefile(一)
严格来说,文章标题中的“转换”并不完全合适.本文的主要内容是基于Oracle数据表的数据来生产出Shapefile文件.进行该工作的一个前提条件是:Oracle数据表中包含坐标数值字段,一般来说就是x ...
- C++ STL详解
C++ STL详解 转载自:http://www.cnblogs.com/shiyangxt/archive/2008/09/11/1289493.html 一.STL简介 STL(Standard ...
- codeVS 动态最大子段和
题目链接:戳我 对于最大子段和,我们只需要维护四个变量--maxl,maxr,maxs,sum(分别表示区间最大前缀子段和,区间最大后缀子段和,区间最大子段和,区间所有数的和) 然后合并的时候是这样的 ...