`
做一行爱一行吧
  • 浏览: 23526 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

erlang的gen_server

 
阅读更多

       gen_server,是erlang中很重要的一个行为框架,他主要的职责就是什么呢,书上说的很多,不过说到底,他就是负责创建成和进程之间的通信!其实看了application和supervious等行为框架,你会发现,我们在进行erlang开发的时候大多时候用的都是erlang的固定行为框架,这应该成为了一种默认的模式,一般情况下,我们都是按照这种方式来开发的,我看过好多的erlang代码,包括复杂以及简单的otp开发代码,都是以这种方式在写码!!!

 

-module(monster_manager).

-behaviour(gen_server).

-record(state, {seq = 1}).

-export([start_link/0]).

-export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).


start_link()->
	gen_server:start_link({local, ?MODULE}, ?MODULE , [], []).
        %%启动一个进程,在作为监督树上的一个进程
		
init([]) ->
	{ok, #state{}}.
        %%初始化进程的状态

%%
%% handle_call
%%

handle_call(_Request, _From, State) ->
    Reply = ok,
    {reply, Reply, State}.
%%同步调用方法,这里很容易看到函数的返回值里不仅有状态还有,一个reply的值

%%
%% handle_cast
%%
handle_cast(_Msg, State) ->
    {noreply, State}.
%%异步调用方法无返回值但是有状态

%%
%% handle_info
%%

%%
handle_info({stop_monster,ProcName}, State) ->
    monster_sup:stop_monster(ProcName),
    {noreply, State};

handle_info({stop_iobject,ProcName}, State) ->
    monster_sup:stop_iobject(ProcName),
    {noreply, State};
    
handle_info(_Info, State) ->
    {noreply, State}.

%%终止进程
terminate(_Reason, _State) ->
    ok.

%%代码热更部分
code_change(_OldVsn, State, _Extra) ->
    {ok, State}.
	

        以上是一个我们产生怪物的使用gen_server的小框架(部分代码),可以看到这里有gen_server必备的几个方法,这些是必备的方法,否则会报错!

       我们什么时候使用handle_info呢?既不是同步也不是异步消息的方式我们都用它去匹配!这里如果仅仅是写一些自己的小程序,估计是用不到handle_info的,不过当我们是用消息模式来通信,例如,Message!Pid的时候我们都是用它来匹配,但是最好别这样做,erlang的编程有些时候比较机械规范,好像我认识的人和我看过的代码,大都以一种方式在写!

       来说说init(),这个方法,我们其实也是基本用不到的,原因很简单,我们在前面的sup中已经初始化了他的每一个子进程,不过如果因为一些特殊的原因,这个进程需要自己一些独特的状态是,我们才会在这里来初始化。       以上就是gen_server的简单讲解,这里gen_server和gen_fsm会有许多人搞混,虽然他们的解释很不一样,但是如果是第一次用erlang没准还真的就会不知道什么时候该用哪个,我就是这样,一开始的时候单纯的认为,gen_fsm(明天说一下)既然能解决为什么要用gen_server,那个时候就是每天都在思考他们为什么一定要这么用,说实话,有点钻牛角尖,因为我们是上层应用者,只要知道在什么环境下用哪一个更好就可以了,对于下一层的东西如果感兴趣有时间可以看一看,不过我不是专门搞研究的,所以并没有更深入的去研究。

   

      

分享到:
评论

相关推荐

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

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

    gen_server:Erlang 的 gen_server 的(不完整的)OcamlAsync 实现

    《Erlang gen_server在OcamlAsync中的实现探索》 Erlang的gen_server是其并发模型的核心组件,它提供了一种强大的状态管理和错误处理机制。而在OCaml语言中,尽管有着自己的并发库如Async,但直接移植或模仿Erlang...

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

    基于Erlang的gen_tcp库是其强大的网络编程接口,用于实现TCP协议的应用。在这个场景中,我们讨论的是一个使用Erlang和gen_tcp编写的聊天室应用。 **gen_tcp简介** gen_tcp是Erlang OTP(开放电信平台)提供的一种...

    gen_tcp_server:Erlang 应用程序的通用 TCP 服务器

    通用 TCP 服务器 通用 TCP 服务器( gen_tcp_server ) 是一种 Erlang 行为,提供快速简便的方法将 TCP 服务器功能添加到您的应用程序。 它被实现为管理 TCP 连接的主管,因为它是孩子。如何使用它? 运行make来构建。...

    erlang tcp_server

    4. **gen_tcp模块**:这个模块提供了处理TCP连接的函数,如`gen_tcp:connect/3`用于建立客户端连接,`gen_tcp:recv/2,3`用于接收数据,`gen_tcp:send/2`用于发送数据,以及`gen_tcp:close/1`用于关闭连接。...

    gen_server tasting 之超简单名称服务

    在Erlang编程语言中,`gen_server`行为是一个强大的模块,用于构建具有状态的、容错的服务。这篇名为“gen_server tasting 之超简单名称服务”的博客文章可能介绍了如何利用`gen_server`来实现一个简单的命名服务。...

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

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

    基于erlang的文件存储

    2. **gen_server**:gen_server是Erlang中的一种行为(behavior),它提供了一种标准的方式来处理服务请求、状态管理和错误处理。在文件存储系统中,gen_server可能包含如下功能:接收上传请求,将文件保存到磁盘,...

    erlang 聊天室

    在本文中,我们将深入探讨如何使用Erlang构建一个简易的聊天室,主要涉及的关键技术是gen_tcp和gen_server。Erlang是一种并发性极强、面向进程的编程语言,特别适合于构建高可用性和可扩展性的分布式系统,如聊天室...

    Erlang_OTP_设计原理(含目录).pdf

    文档详细讲解了Gen_Server行为模式,其中包括如何启动和停止Gen_Server,处理同步(Call)和异步(Cast)调用,以及在监督树中的集成。Gen_Fsm行为介绍了有限状态机的基本原理以及如何使用Gen_Fsm来管理状态变化和...

    gen-batch-server:用于Erlang和Elixir的通用批处理服务器

    2. **测试用例**:用于验证gen-batch-server功能的测试文件,例如test/gen_batch_server_SUITE.erl或test/gen_batch_server_test.exs。 3. **配置文件**:可能包含服务器的配置参数,如config/config.exs或sys....

    node_erlastic:通过端口连接在ErlangElixir中创建nodejs gen_server的节点库

    通过端口连接在Erlang / Elixir中制作nodejs gen_server的节点库。 该模块使您能够: 在Binary Erlang Term和javascript类型之间进行解码和编码 通过nodeJS可读和可写(双工)创建一个简单的Erlang端口接口 创建一...

    erlang_otp_src_17.3.tar.gz

    7. **行为模块**:如gen_server、gen_event、gen_fsm等,是OTP设计模式的具体实现,简化了编写服务器、事件处理器和有限状态机的代码。 关于压缩包内的"otp_src_17.3",这是Erlang OTP 17.3版本的源代码目录。为了...

    erlang server源码

    Erlang提供了一些预定义的行为模式,如gen_server、gen_event和gen_fsm等,它们为实现特定类型的服务提供了模板。echatServer可能使用gen_server行为来实现服务器的核心逻辑,包括用户注册、登录、发送和接收消息等...

    编写分布式的Erlang程序_陷阱和对策(中文版)

    Erlang提供了`monitor`、`link`和`gen_server`行为等机制来帮助管理同步和异常。 9. ** OTP设计原则**:OTP(Open Telecom Platform)是Erlang的框架,包含了一系列设计模式和库。理解并遵循OTP的设计原则,如行为...

    erlang_standard_snippets-源码.rar

    8. **行为(Behaviours)**: Erlang的行为如gen_server、gen_event和gen_fsm,提供了标准的服务器、事件管理和有限状态机的实现框架。源码中可能会有这些行为的实例。 9. **并发与分布式(Concurrency and ...

    Erlang_OTP_设计原理 中文版

    例如Gen_Server、Gen_Fsm、Gen_Event和Supervisor等。每个行为模式都有其通用部分和特定部分。通用部分由Erlang/OTP库提供,开发者只需要专注于实现特定部分,即回调模块,以及根据需要导出特定的回调函数。 3. ...

    gen_bittorrent:gen_bittorrent行为

    首先,gen_bittorrent这个名字来源于Erlang的通用行为模式gen_server,这是一个设计模式,用于实现服务器进程,它提供了一种标准的方式来处理请求和状态管理。gen_bittorrent库将这种模式应用于BitTorrent种子文件的...

Global site tag (gtag.js) - Google Analytics