`
hideto
  • 浏览: 2678196 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

OTP Design Principles: Gen_Server Behaviour

阅读更多
OTP Design Principles: Gen_Server Behaviour

1,Client-Server原则
client-server模型由一个中心服务器和任意多的客户端组成
该模型主要用来做资源管理操作,不同的客户端共享一个通用的资源,服务器负责管理该资源

2,例子
-module(ch3).
-behaviour(gen_server).

-export([start_link/0]).
-export([alloc/0, free/1]).
-export([init/1, handle_call/3, handle_cast/2]).

start_link() ->
  gen_server:start_link({local, ch3}, ch3, [], []).

alloc() ->
  gen_server:call(ch3, alloc).

free(Ch) ->
  gen_server:cast(ch3, {free, Ch}).

init(_Args) ->
  {ok, channels()}.

handle_call(alloc, _From, Chs) ->
  {Ch, Chs2} = alloc(Chs),
  {reply, Ch, Chs2}.

handle_cast({free, Ch}, Chs) ->
  Chs2 = free(Ch, Chs),
  {noreply, Chs2}.


3,启动Gen_Server
ch3:start_link():
start_link() ->
  gen_server:start_link({local, ch3}, ch3, [], []) => {ok, Pid}

gen_server:start_link/4启动一个新进程并连接它,新进程为一个gen_server
1)第一个参数指定gen_server名字,{local, ch3}表示在本地注册一个gen_server进程为ch3
2)第二个参数指定callback module为ch3,在这里接口方法和callback方法都放在一个module里,这是一个好的编程实践
3)第三个参数指定init方法的参数
4)第四个参数为options
如果名字注册成功,新的gen_server进程调用callback方法ch3:init([]),返回{ok, State}
gen_server:start_link是同步的,直到gen_server初始化并且可以接收请求才返回,gen_server:start_link由supervisor启动,它是supervision tree的一部分
gen_server:start启动一个单独的进程,gen_server:start不是supervision tree的一部分,它没有supervisor

4,同步请求——Call
同步请求alloc()由gen_server:call/2实现:
alloc() ->
  gen_server:call(ch3, alloc).

ch3是gen_server的名字,alloc是实际的请求
该请求会发送一条消息给gen_server,请求接受以后,gen_server调用handle_call(Request, From, State)并返回{replay, Replay, State1}

5,异步请求——Cast
异步请求free(Ch)由gen_server:cast/2实现
free(Ch) ->
  gen_server:cast(ch3, {free, Ch}).

ch3是gen_server的名字,{free, Ch}是真正的请求
callback方法为handle_cast(Request, State),返回{noreply, State1}.

6,关闭
6.1 在Supervision Tree中
如果gen_server是supervision tree的一部分,则不需要stop方法。gen_server会被supervisor自动关掉。
如果需要在关闭gen_server之前做清理工作,那么shutdown strategy必须为一个timeout并且必须在gen_server的init方法中设置捕获exit信号
gen_server将在关闭时调用callback方法terminate(shutdown, State):
init(Args) ->
  ...,
  process_flag(trap_exit, true),
  ...,
  {ok, State}.
...
terminate(shutdown, State) ->
  ..code for cleaning up here..
  ok.


6.2 单独的Gen_Servers
如果gen_server不是supervision tree的一部分,那么定义一个stop方法会比较有用:
...
export([stop/0]).
...
stop() ->
  gen_server:cast(ch3, stop).
...

handle_cast(stop, State) ->
  {stop, normal, State};
handle_cast({free, Ch}, State) ->
  ...
...

terminate(normal, State) ->
  ok.

callback方法处理stop请求,然后返回{stop, normal, State1},norma指定这是一个正常的关闭,State1为gen_server的state的新的值
这将使得gen_server调用terminate(normal, State1),然后优雅的关闭服务器

7,处理其他消息
如果gen_server可以接受除了请求外的其他消息,那么callback方法handle_info(Info, State)必须实现来处理它们
例如gen_server连接到supervisor以为的其他进程并捕获到exit信号,这时就会接受一个exit消息
handle_info({'EXIT', Pid, Reason}, State) ->
  ..code to handle exits here..
  {noreply, State1}.


补充:gen_server exports and callbacks
gen_server module              callback module
gen_server:start_link -------> Module:init/1
gen_server:start
gen_server:call -------------> Module:handle_call/3
gen_server:multi_call
gen_server:cast -------------> Module:handle_cast/2
gen_server:abcast              
gen_server:replay
gen_server:enter_loop
                               Module:handle_info/2
                               Module:terminate/2
                               Module:code_change/3
分享到:
评论

相关推荐

    gen_server tasting 之超简单名称服务(续)

    在IT行业中,`gen_server`是Erlang OTP(开放电信平台)框架中的一个核心组件,它提供了一种模式化的方式来实现服务器进程。本篇博客“gen_server tasting 之超简单名称服务(续)”主要探讨了如何使用gen_server来...

    erlang OTP Design Principles之Gen中文

    Erlang OTP设计原则中的Gen_Fsm行为是一个关键的概念,用于构建健壮、可扩展的并发应用程序。Gen_Fsm,即通用有限状态机,是一种行为模式,它提供了一种结构化的方法来处理具有多种状态和事件的系统。本文将深入探讨...

    Erlang安装包,版本:otp_win64_24.1.7.exe

    otp_win64_24.1.7.exe

    erl:otp_src_24.0.5.tar.gz

    标题中的"erl:otp_src_24.0.5.tar.gz"指的是Erlang的源码包,其中"otp_src_24.0.5"是Erlang/OTP (Open Telecom Platform) 的24.0.5版本的源代码。Erlang是一种面向并发的、函数式的编程语言,常用于构建高可用性和...

    OTP Design Principles

    - **异步请求-Cast**:如果不需要等待服务器的响应,可以使用`gen_server:cast/2`发送异步请求。 - **停止**:可以使用`gen_server:stop/1`来终止一个GenServer进程。 - **处理其他消息**:除了处理请求外,...

    分布式应用Erlang:Erlang_OTP_19_win64

    Erlang OTP 19_win64是一款专为Windows 64位系统设计的Erlang软件开发工具包,它包含Erlang编程语言和OTP(Open Telecom Platform)框架。Erlang是一种强大的、动态类型的函数式编程语言,特别适合构建高可用性、...

    基于Erlang的gen_tcp聊天室代码,功能完整

    gen_tcp是Erlang OTP(开放电信平台)提供的一种行为模块,它允许程序员以面向过程的方式处理TCP连接。gen_tcp提供了创建、监听、接受和关闭TCP套接字的函数,以及发送和接收数据的基本操作。 **Erlang的并发特性**...

    gen_state_machine:OTP 19(及更高版本)中gen_statem的惯用Elixir包装器

    OTP 20(及更高版本)中gen_statem的惯用Elixir包装器。 完整文档可。 您可以在在Hex上找到该软件包。 gen_statem和此包装器之间的一个重要区别是,您在此包装器use GenStateMachine回调模式声明为use ...

    gen_server tasting 之超简单名称服务(再续)

    在IT行业中,`gen_server` 是Erlang OTP(开放电信平台)框架中的一个核心行为模块,用于构建可靠且容错的服务。它提供了一种模式,使得开发者可以编写并发、状态管理和故障恢复的服务器进程。在"gen_server tasting...

    pin_code_fields:Flutter软件包,将帮助您生成具有精美设计和动画的PIN码字段。 可以用于OTP或Pin码输入:nerd_face::nerd_face:

    可用于OTP或Pin码输入 :nerd_face: :nerd_face: 特征 :green_heart: 自动将下一个字段集中在键入上,将上一个字段集中在删除上 游标支持 :high_voltage: 可以设置为任意长度。 (建议3-6个字段) 文本字段的3种...

    otp_src_22.0_h.tar.gz

    OTP提供了几个设计良好的应用框架,如gen_server、gen_event、gen_fsm等,它们是基于行为模式的模块,简化了并发编程和状态管理。 5. **分布式功能** OTP支持跨节点的分布式计算,使得在多台机器上构建分布式系统...

    otp_win64_26.1.2.jpg

    otp_win64_26.1.2.jpg

    otp_src_21.2_linux.rar

    OTP(Open Telecommunications Platform)是Erlang编程语言的核心组件之一,主要为构建高可用、分布式和实时系统提供强大的工具。OTP源代码包通常包含了Erlang运行时系统、库和开发工具,使得开发者能够在各种操作...

    otp_verify_java.rar_OTP_OTPVerify_TOTP_otp算法_一次性 口令

    OTP(One-Time Password)是一种基于时间、事件或挑战/应答机制的一次性密码技术,用于提高用户身份验证的安全性。OTP确保每个密码只能使用一次,从而降低了密码被重放攻击的风险。在Java环境中,我们可以使用不同的...

    OTP.zip_OTP_OTP .nd pudn_java otp_otp java_verify

    在本项目中,“OTP.zip”是一个压缩包,其中包含了实现OTP生成和验证功能的Java代码。 OTP通常基于时间同步(TOTP)或基于挑战-响应的哈希算法(HMAC)两种方式。在这个"OTP"项目中,可能使用了TOTP,因为它是目前...

    otp_win64_23.1.exe|otp_win64_23.1.zip

    2. OTP框架:理解其模块化设计、行为(gen_server, gen_event等)、分布式应用和系统监控。 3. RabbitMQ基本概念:掌握消息队列的工作原理、交换器(exchanges)、队列(queues)、绑定(bindings)以及消费者...

    RabbitMQ系统客户端连接到RabbitMQ服务端消息通信过程1

    - `amqp_gen_connection`使用`gen_tcp:connect`与服务器建立TCP连接。服务器端响应并启动`rabbit_client_sup`监督树,包括`rabbit_connection_sup`,进一步创建`rabbit_connection_helper_sup`和`rabbit_reader`...

    Erlang otp_win64_21.1.exe otp_win32_21.1.exe

    Erlang OTP(Open Telephony Platform)是Erlang编程语言的一个核心组成部分,它提供了一套全面的库和工具,用于构建高度并发、分布式、容错的系统。OTP的全称实际上是“Open Telecom Platform”,但在现代,它更...

    erlang_otp_win64_25.0

    Erlang OTP (Open Telephony Platform) 是一种高级并发编程语言和框架,主要由瑞典电信设备制造商Ericsson开发,用于构建高度可靠、可扩展和实时的分布式系统。Erlang OTP 25.0是该平台的一个版本,特别针对Windows ...

Global site tag (gtag.js) - Google Analytics