Eralng 编程中的OTP

OTP里面创建进程时 常用有四大behaviour

• supervisor

• gen_server

• gen_fsm

• gen_event

在erlang的编译器中,behaviour的作用使用来定义一个规约。定义好这个规约,任何遵守这个规约的模块,必须按照规约中的要求,使用-export([])。导出对应的函数,导出后的这些函数将由behaviour统一支配。

behaviour只不过是实现代码组织的一种手段,behaviour就是把代码分成通用部分,以及每一个回调模块需要去做的特殊部分。

erlang程序设计里面有个设计原则就是把你的进程构造成树,把共用代码提出来,特定功能用自己的module实现,这也就是behaviour了,应用behaviour可以减少与本身事务无关的代码量,设计逻辑更加清晰。

所以,使用-behaviour()定义的模块都是这个behaviour所要求实现的回调模块。

自定义Erlang的经典应用:rabbitmq 他对erlang自带的gen_server进行了改进,写了gen_server2。因为gen_server中的消息队列是一个普通的消息队列不能满足需求,改进后的gen_server2使用了带有优先级的消息队列。

使用behaviour

应用erlang的behaviour 框架(gen_server,gen_fsm,gen_event,supervisor)在处理很多情况的时候省下大量不必要的代码,使用的时候在框架基础添加自定义逻辑就可以搭建项目了,可以说是精髓。

gen_server:

提供的是client和server之间,请求和回调的处理。

用于多个客户共用一个资源的这种情况。它由几个接口函数和几个回调函数组成(回调函数必须定义在你的module里定义),这些可以参考erlang的doc。

gen_fsm:

提供的是even状态转换和action触发处理

gen_event:

提供的是event manager 对event的处理。自定义event manager收到event,进行自定义处理

gen_event和gen_fsm的区别:

gen_fsm带有外部状态(自定义状态)转换,一个状态由于某事件发生,导致状态发生变化,触发action的同时进入下一个状态,可以是个循环。 (类似水与冰的装换,遇冷变冰,遇热化水)

gen_event对事件进行处理,可以理解为单向的。event给过来,event manager处理掉。

supervisor:提过的事对子进程的启动,停止,监控操作。可以说是一个异常处理框架,但又类似切面,可以干涉到项目的每个进程(启动或停止任意子进程)。如果子进程需要重启,supervisor会根据重启策略和最大重启频率这些参数确定如何重启子进程。

参考引用:

erlang四大behaviour简述_思月行云的博客-CSDN博客

[Erlang 学习笔记]erlang behaviour小总结_lqg1122的博客-CSDN博客

Erlang关键字之behaviour_犀牛_2046的博客-CSDN博客_behaviour erlang



Eralng程序设计(第二版)

-behaviour()的使用,他具体有什么作用的更多相关文章

  1. Erlang基础知识集锦

    http://wenku.baidu.com/link?url=or-8mkUYUM0uVeqCYESGe93YIlh2IDLP7lFOwRlwr8Syf3PeHbwJC5DPCErs4NFrb1p4 ...

  2. erlang四大behaviour之二-gen_fsm

    来源:http://www.cnblogs.com/puputu/articles/1701012.html 今天介绍erlang的一个非常重要的behaviour,就是gen_fsm-有限状态机,有 ...

  3. springmvc中的页面解析器ViewResolver不起作用,变量输出字符串的解决方案

    <web-app xmlns:web="http://xmlns.jcp.org/xml/ns/javaee"> <servlet> <servlet ...

  4. spring cloud ----> RibbonClient设置的熔断器Hystrix不起作用

    Ribbon spring.io 官网的简介: Ribbon is a client side load balancer which gives you a lot of control over ...

  5. Erlang/OTP:基于Behaviour的回调函数

    原始链接:https://blog.zhustec.me/posts/erlang-otp-1-callback-based-on-behaviour OTP 是什么 OTP 的全称是开源电信平台 ( ...

  6. if __name__== "__main__" 的意思(作用)python代码复用

    if __name__== "__main__" 的意思(作用)python代码复用 转自:大步's Blog  http://www.dabu.info/if-__-name__ ...

  7. (转载)linux下各个文件夹的作用

    linux下的文件结构,看看每个文件夹都是干吗用的/bin 二进制可执行命令 /dev 设备特殊文件 /etc 系统管理和配置文件 /etc/rc.d 启动的配置文件和脚本 /home 用户主目录的基 ...

  8. github中的watch、star、fork的作用

    [转自:http://www.jianshu.com/p/6c366b53ea41] 在每个 github 项目的右上角,都有三个按钮,分别是 watch.star.fork,但是有些刚开始使用 gi ...

  9. web.xml中welcome-file-list的作用

    今天尝试使用struts2+ urlrewrite+sitemesh部署项目,结果发现welcome-file-list中定义的欢迎页不起作用: <welcome-file-list> & ...

  10. web.xml中load-on-startup的作用

    如下一段配置,熟悉DWR的再熟悉不过了:<servlet>   <servlet-name>dwr-invoker</servlet-name>   <ser ...

随机推荐

  1. JZOJ 4318. 【NOIP2015模拟11.5】俄罗斯套娃

    题目大意 求逆序对个数小于等于 \(k\) 的排列数 解析 已经做过很多次了,经典得不能再经典的问题 注意本题很卡空间,要用滚动数组 \(Code\) #include<cstdio> u ...

  2. JZOJ 1495. 宝石

    题目大意 用边长为 \(k\) 的正方形在平面内覆盖,求它能覆盖的最大点权和 思路 \(60\) 分:其实很容易想到按它们的横坐标先后排序,然后单调队列维护.复杂度 \(O(n k \log k)\) ...

  3. Vulhub 漏洞学习之:ECShop

    Vulhub 漏洞学习之:ECShop 目录 Vulhub 漏洞学习之:ECShop 1 ECShop 2.x/3.x SQL注入/远程命令执行漏洞 1.1 环境安装 1.2 漏洞产生原因 1.3 漏 ...

  4. JS结束时间与当前时间间隔

    实现内容: 1.时间戳 1587024986952 转成年月日时分秒 2020-04-16 16:16:46 2.当前时间new Date()转成年月日时分秒2019-04-17 10:27:27 3 ...

  5. XShell 连接 VMware Linux

    如果你的系统是 Ubuntu,并且是精简安装的系统,极大可能使用ifconfig时会提示你安装相关依赖,所以你安装的时候要记得顺带安装 ifconfig: sudo apt install ifcon ...

  6. day08-MyBatis的关联映射02

    MyBatis的关联映射02 3.一对多 3.1基本介绍 mybatis – MyBatis 3 | XML 映射器 多对一关系也是一个基本的映射关系,多对一,也可以理解为一对多.例如: User-- ...

  7. 溢出标志位OF与进位标志位CF判断

    1.OF与CF概述 OF(Overflow Flag,溢出标志位):有符号数之间加减运算的溢出标志 CF(Carry Flag,进位标志位):无符号数之间加减运算的溢出标志 快速判断(加法)(减法可转 ...

  8. Android 数据回显

    public class EchoDataUtils { /** * 保存文件到手机内存 * @param context * @param number * @param psw * @return ...

  9. Servlet-随机生成验证码(初级版本)

    Servlet之 验证码(初级) 需求: 使用Servlet向页面响应验证码,并且点击验证码或者"看不清楚,换一张"可以刷新验证码 需求分析: Servlet中需要完成的需求: 验 ...

  10. reset slave

    reset slave 所有中继日志文件都被删除,即使它们还没有被复制 SQL 线程完全执行. reset slave all 所有中继日志文件都被删除,它会清除连接参数(需要重新change mas ...