- 浏览: 2650124 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
80后的童年2:
深入浅出MongoDB应用实战开发网盘地址:https://p ...
MongoDB入门教程 -
shliujing:
楼主在不是精通java和php的前提下,请不要妄下结论。
PHP、CakePHP哪凉快哪呆着去 -
安静听歌:
希望可以一给一点点注释
MySQL存储过程之代码块、条件控制、迭代 -
qq287767957:
PHP是全宇宙最强的语言!
PHP、CakePHP哪凉快哪呆着去 -
rryymmoK:
深入浅出MongoDB应用实战开发百度网盘下载:链接:http ...
MongoDB入门教程
1,有限状态机
FSM,有限状态机,可以用以下形式来描述做一个关系集:
意思是,如果我们位于状态S,然后事件E发送了,则我们应该执行动作A,并且将状态改为S'
2,例子
有一个代码锁的门,如果输入的代码顺序是对的,那么将门打开30秒
如果输入代码不完全,则等待下次按钮按下,如果输入代码顺序是错的,则重新开始等待按钮按下
3,启动Gen_Fsm
上面的例子里,使用code_lock:start_link(Code)启动gen_fsm:
start_link调用gen_fsm:start_link/4,启动一个新的gen_fsm进程并连接。
1)第一个参数{local, code_lock}指定名字,在本地注册为code_lock
2)第二个参数code_lock执行callback模块
3)第三个参数Code是传递给callback方法init的参数,在这里init方法得到正确的代码锁的代码
4)第四个采纳数[]是options
如果进程注册成功,则新的gen_fsm进程调用callback方法code_lock:init(Code),返回{ok, StateName, StateData}
StateName是gen_fsm的初始状态,在这里返回的是locked,表示初始状态下门是锁着的
StateData是gen_fsm的内部状态,在这里state data是当前的按钮顺序(初始时为空)和正确的锁代码
注意gen_fsm:start_link是同步的,直到gen_fsm进程初始化并准备好开始接受请求时才会返回
gen_fsm:start_link表示有supervisor,gen_fsm:start则是启动单独的gen_fsm进程
4,事件通知
使用gen_fsm:send_event/2来实现按钮事件的通知:
code_lock是gen_fsm进程的名字,{button, Digit}是真正的事件
事件会当成消息发送给gen_fsm进程,事件接收以后,gen_fsm调用StateName(Event, StateData)并返回{next_state, StateName1, StateData1}
StateName是当前状态的名字,StateName1是下一个即将变成的状态的名字,StateData1是gen_fsm的新的state data值:
如果门是锁着的,这时按下一个按钮,则比较目前按钮的顺序和正确的代码顺序,由比较结果来决定是unlock门还是继续保持locked
5,超时
当输入正确的按钮顺序后,门unlock然后返回如下的tuple:
30000表示超时时间为30000毫秒,在30000毫秒之后,发生超时,超时后调用StateName(timeout, StateData)
在这里,门打开30秒之后再次锁上:
6,所有的状态事件
有时候一个事件可以到达gen_fsm进程的任何状态,这时消息可以使用gen_fsm:send_all_state_event/2来发送消息,然后用Module:handle_event/3来处理
7,停止
7.1 在Supervision Tree里
如果gen_fsm在supervision tree里,则不需要stop方法,gen_fsm会自动被supervisor停止
如果需要在结束前清理数据,那么shutdown strategy必须为一个timeout,并且必须在gen_fsm的init方法里设置捕获exit信号,然后
gen_fsm进程会调用callback方法terminate(shutdown, StateName, StateData)
7.2 单独的Gen_Fsms进程
如果gen_fsm进程没有supervisor,则需要一个stop方法:
callback方法处理stop事件并返回{stop, normal, StateData1},normal表示正常停止,StateData1为gen_fsm的新的data data值
这将导致gen_fsm调用terminate(normal, StateName, StateData1)然后优雅的停止
8,处理其他消息
其他消息的处理callback方法为handl_info(Info, StateName, StateData),例如连接到其他非supervisor进程并捕获exit信号时处理exit消息:
补充:gen_fsm exports and callbacks
FSM,有限状态机,可以用以下形式来描述做一个关系集:
State(S) x Event(E) -> Actions(A), State(S')
意思是,如果我们位于状态S,然后事件E发送了,则我们应该执行动作A,并且将状态改为S'
2,例子
有一个代码锁的门,如果输入的代码顺序是对的,那么将门打开30秒
如果输入代码不完全,则等待下次按钮按下,如果输入代码顺序是错的,则重新开始等待按钮按下
-module(code_lock). -behaviour(gen_fsm). -export([start_link/1]). -export([button/1]). -export([init/1, locked/2, open/2]). start_link(Code) -> gen_fsm:start_link({local, code_lock}, code_lock, Code, []). button(Digit) -> gen_fsm:send_event(code_lock, {button, Digit}). init(Code) -> {ok, locked, {[], Code}}. locked({button, Digit}, {SoFar, Code}) -> case [Digit|SoFar] of Code -> do_unlock(), {next_state, open, {[], Code}, 3000}; Incomplete when length(Incomplete) < length(Code) -> {next_state, locked, {Incomplete, Code}}; _Wrong -> {next)state, locked, {[], Code}}; end. open(timeout, State) -> do_lock(), {next_state, locked, State}.
3,启动Gen_Fsm
上面的例子里,使用code_lock:start_link(Code)启动gen_fsm:
start_link(Code) -> gen_fsm:start_link({locak, code_lock}, code_lock, Code, []).
start_link调用gen_fsm:start_link/4,启动一个新的gen_fsm进程并连接。
1)第一个参数{local, code_lock}指定名字,在本地注册为code_lock
2)第二个参数code_lock执行callback模块
3)第三个参数Code是传递给callback方法init的参数,在这里init方法得到正确的代码锁的代码
4)第四个采纳数[]是options
如果进程注册成功,则新的gen_fsm进程调用callback方法code_lock:init(Code),返回{ok, StateName, StateData}
StateName是gen_fsm的初始状态,在这里返回的是locked,表示初始状态下门是锁着的
StateData是gen_fsm的内部状态,在这里state data是当前的按钮顺序(初始时为空)和正确的锁代码
init(Code) -> {ok, locked, {[], Code}}.
注意gen_fsm:start_link是同步的,直到gen_fsm进程初始化并准备好开始接受请求时才会返回
gen_fsm:start_link表示有supervisor,gen_fsm:start则是启动单独的gen_fsm进程
4,事件通知
使用gen_fsm:send_event/2来实现按钮事件的通知:
button(Digit) -> gen_fsm:send_event(code_lock, {button, Digit}).
code_lock是gen_fsm进程的名字,{button, Digit}是真正的事件
事件会当成消息发送给gen_fsm进程,事件接收以后,gen_fsm调用StateName(Event, StateData)并返回{next_state, StateName1, StateData1}
StateName是当前状态的名字,StateName1是下一个即将变成的状态的名字,StateData1是gen_fsm的新的state data值:
locked({button, Digit}, {SoFar, Code}) -> case [Digit|SoFar] of Code -> do_unlock(), {next_state, open, {[], Code}, 3000}; Incomplete when length(Incomplete) < length(Code) -> {next_state, locked, {Incomplete, Code}}; _Wrong -> {next_state, locked, {[], Code}}; end. open(timeout, State) -> do_lock(), {next_state, locked, State}.
如果门是锁着的,这时按下一个按钮,则比较目前按钮的顺序和正确的代码顺序,由比较结果来决定是unlock门还是继续保持locked
5,超时
当输入正确的按钮顺序后,门unlock然后返回如下的tuple:
{next_state, open, {[], Code}, 30000};
30000表示超时时间为30000毫秒,在30000毫秒之后,发生超时,超时后调用StateName(timeout, StateData)
在这里,门打开30秒之后再次锁上:
open(timeout, State) -> do_lock(), {next_state, locked, State}.
6,所有的状态事件
有时候一个事件可以到达gen_fsm进程的任何状态,这时消息可以使用gen_fsm:send_all_state_event/2来发送消息,然后用Module:handle_event/3来处理
-module(code_lock). ... -export([stop/0]). ... stop() -> gen_fsm:send_all_state_event(code_lock, stop). ... handle_event(stop, _StateName, StateData) -> {stop, normal, StateData}.
7,停止
7.1 在Supervision Tree里
如果gen_fsm在supervision tree里,则不需要stop方法,gen_fsm会自动被supervisor停止
如果需要在结束前清理数据,那么shutdown strategy必须为一个timeout,并且必须在gen_fsm的init方法里设置捕获exit信号,然后
gen_fsm进程会调用callback方法terminate(shutdown, StateName, StateData)
init(Args) -> ..., process_flag(trap_exit, true), ..., {ok, Statename, StateData}. ... terminate(shutdown, StateName, StateData} -> ..code for cleaning up here.. ok.
7.2 单独的Gen_Fsms进程
如果gen_fsm进程没有supervisor,则需要一个stop方法:
... -export([stop/0]). ... stop() -> gen_fsm:send_all_state_event(code_lock, stop). ... handle_event(stop, _StateName, StateData) -> {stop, normal, StateData}. ... terminate(normal, _StateName, _StateData) -> ok.
callback方法处理stop事件并返回{stop, normal, StateData1},normal表示正常停止,StateData1为gen_fsm的新的data data值
这将导致gen_fsm调用terminate(normal, StateName, StateData1)然后优雅的停止
8,处理其他消息
其他消息的处理callback方法为handl_info(Info, StateName, StateData),例如连接到其他非supervisor进程并捕获exit信号时处理exit消息:
handle_info({'EXIT', Pid, Reason}, StateName, StateData) -> ..code to handle exits here.. {next_state, StateName1, StateData1}.
补充:gen_fsm exports and callbacks
gen_fsm module Callback module gen_fsm:start_link -------------------> Module:init/1 gen_fsm:start gen_fsm:send_event -------------------> Module:StateName/2 gen_fsm:send_all_state_event ---------> Module:handle_event/3 gen_fsm:sync_send_event --------------> Module:StateName/3 gen_fsm:sync_send_all_state_event ----> Module:handle_sync_event/4 gen_fsm:reply gen_fsm:send_event_after gen_fsm:start_timer gen_fsm:cancel_timer gen_fsm:enter_loop Module:handle_info/3 Module:terminate/3 Module:code_change/4
发表评论
-
ECUG III -- Elrang中国用户组第三次活动
2008-11-06 11:00 2194详情请见: http://ecug.org/ 大家也帮忙宣传 ... -
Erlang内存管理和运行模式笔记
2008-09-25 16:40 5335Erlang进程非常轻量级 进程间通过消息传递进行通讯 进程接 ... -
Erlang:一个通用的网络服务器
2008-09-24 16:50 6023原文: Erlang: A Generalized TCP S ... -
Erlang里的make
2008-09-22 17:38 3672Erlang自带一个make工具 我们看一个例子 目录结构: ... -
介绍Erlang里的Record
2008-09-12 15:52 8548原文: Erlang: An Introduction to ... -
Erlang与ActionScript3采用JSON格式进行Socket通讯
2008-09-02 16:37 6199前提: 需要下载as3corelib来为ActionScrip ... -
Erlang的JSON库
2008-09-02 15:40 9300使用下列JSON库: http://www.lshift.ne ... -
Erlang和ActionScript3的Socket通讯
2008-09-02 13:18 2848server.erl -module(server). ... -
Erlang和Ruby的Socket通讯
2008-09-01 22:12 2282server.erl -module(server). ... -
Erlang实现简单Web服务器
2008-09-01 17:59 5739转贴一个简单的Web服务器: httpd.erl %% h ... -
Mnesia用户手册:五,Mnesia高级特性
2008-09-01 17:27 6986本章描述了构建分布式、容错的Mnesia数据库相关的高级特性: ... -
Mnesia用户手册:四,事务和其他访问上下文
2008-08-29 00:06 6709本章讲述Mnesia事务系统和事务属性,它们让Mnesia成为 ... -
Mnesia用户手册:三,构建Mnesia数据库
2008-08-27 21:46 9115本章详细介绍了设计Mnes ... -
Mnesia用户手册:二,Mnesia快速上手
2008-08-27 14:09 9000本章介绍了Mnesia: 1) ... -
Mnesia用户手册:一,介绍
2008-08-26 15:47 7725Mnesia是一个分布式数据 ... -
OTP Design Principles: Supervisor Behaviour
2008-08-26 00:06 3051Supervisor Behaviour是一个用来实现一个su ... -
gen_event例子:terminal_logger
2008-08-25 16:23 1620定义三个terminal_logger: $$ termina ... -
OTP Design Principles: Gen_Event Behaviour
2008-08-25 16:06 17621,事件处理原则 在OTP里,event manager是一个 ... -
gen_fsm例子:code_lock
2008-08-22 18:35 2085改了一下代码,可以run了: %% code_lock.erl ... -
gen_server Hello World
2008-08-22 13:45 1646简单的gen_server Hello World程序 代码 ...
相关推荐
erlang OTP Design Principles之Gen中文erlang OTP Design Principles之Gen中文
otp_win64_24.1.7.exe
OTP 20(及更高版本)中gen_statem的惯用Elixir包装器。 完整文档可。 您可以在在Hex上找到该软件包。 gen_statem和此包装器之间的一个重要区别是,您在此包装器use GenStateMachine回调模式声明为use ...
可用于OTP或Pin码输入 :nerd_face: :nerd_face: 特征 :green_heart: 自动将下一个字段集中在键入上,将上一个字段集中在删除上 游标支持 :high_voltage: 可以设置为任意长度。 (建议3-6个字段) 文本字段的3种...
erl最新版本,erl 23版本 和24版本 属于大版本更新了,有些23版本高性能模块已经不适用24版本,我博客有说明,需要的可以去主页看下。
Erlang是一种通用的面向并发的编程语言,它有瑞典电信设备制造商爱立信所辖的CS-Lab开发, 目的是创造一种可以应对大规模并发活动的编程语言和运行环境。
otp_win64_24.3.exe
react-native-otp-fieldReact本机OTP字段 :keycap_1: :keycap_2: :keycap_3: :keycap_4: :keycap_5:安装npm i react-native-otp-fieldRN <0.63 npm i react-native-otp-field@0.0.7一个可在android和iOS上运行的...
otp_win64_20.3.exe百度网盘下载(官网下载实在是太慢了),亲测有效!! otp_win64_20.3.exe otp_win64_20.3.exe otp_win64_20.3.exe
Erlang/OTP
可能这个实现代码量相对没那么少,但是这样是比较OTP的做法。 ##Installation 在你的rebar.config添加: {gs_tcp, ".*", {git, "https://github.com/roowe/gs_tcp", "master"}} 之后执行 rebar get-deps接着 rebar ...
Erlang/OTP
DX0906VX 显示屏的OTP烧录程序,用来在出厂时设置屏幕的对比度。
Generate & Verify OTP Server
otp_win64_26.0安装包
官网下载超级慢,公司网络也有点封锁,这是我用流量下载的,有需要的可以下载,这是适合Centos的版本21.1
我主页还有相关的rabbitmq-server-3.8.5.exe可以下载,地址https://download.csdn.net/download/qq_39403734/12570527,如果这两个在安装的过程中有什么不懂得可以私聊我,或者我有空的时候出个博客给大家。
erlang_otp_win64_25.0
OTP Design Principles,指导你如何编写otp的各个behaviours
解压后为:otp_src_21.0.tar.gz,附带下载地址