OTP服务器

defmodule Sequence.Server douse GenServerdef handle_call( :next_number, _from, current_number) do{ :reply, current_number, current_number + 1}  #reply告诉OTP将第二个元素返回给客户端end
end

  use的效果将OTP GenServer的行为添加到当前模块。这样它就可以处理所有的回调函数。这也意味着我们不需要在模块中定义所有的回调函数——该行为定义了所有默认的回调函数。

  当客户端调用服务器时,GenServer调用接下来的hand_call函数。它接受:1、客户端传递给调用的信息。2、客户端的PID。3、服务器状态。    

  其返回一个元组给OTP { :reply, current_number, current_number + 1 },reply告诉OTP需要回复客户端,第二个是返回值,第三个定义了新的状态。该状态子在handle_call下次被调用时作为最后一个参数传入。

  

  启动服务器:

iex -S mix
{ :ok, pid } = GenServer.start_link(Sequence.Server, 100)    #100是状态,相当于该进程的一个属性。GenServer.call( pid, :next_number )        # 100
GenServer.call( pid, :next_number )        # 101

  start_link函数的行为类似于spawn_link。它要求GenServer创建一个新的进程并与我们相关联,并传递了一个状态值进去。返回服务器的pid

  call调用pid进程里的handle_call函数,将其第二个参数(:next_number )与handle_call的第一个参数做匹配。handle_call的第一个参数也可以是元组。

def handle_call({ :set_number, new_number}, _form, _current_number ) do{:reply, new_number, new_number }
end然后这样调用
GenServer.call(pid, {:set_number, 999} )        # 999

 

cast

  cast函数调用服务器,但不等待回复。cast发送给handle_cast,由于可能没有相应,所以handle_cast只需要两个参数。放弃了第二个代表客户端pid的参数。其返回元组为{ :noreply, new_state }

defmodule Sequence.Server douse GenServerdef handle_call( :next_number, _from, current_number) do{ :reply, current_number, current_number + 1}enddef handle_cast({:increment_number, delta}, current_number) do{ :noreply, current_number + delta}end
endGenServer.call(pid, :next_number)      #100
GenServer.call(pid, :next_number)    #101
GenServer.cast(pid, {:increment_number, 200})    # :ok
GenServer.call(pid, :next_number)      #302

 

回调函数

  init(start_arguments)。当GenServer启动服务器时被调用,默认将服务器状态设置为出入参数的值。

  handle_call(request, from, state)。客户端使用GenServer.call(pid, request)时被调用。成功返回{ :reply, result, new_state }

  handle_cast(request, state)。用于响应GenServer.cast(pid, request)。成功的相应是{ :noreply, new_state },也能返回{ :stop, reason, new_state }

  handle_info(info, state)。用于处理call和cast以外的传入消息。

  terminate(reason, state)。当服务器将终止时该函数被调用。

  code_change(from_version, state, extra)。理由OTP替换正在运行的服务器而无需停止整个系统。

  format_status(reason, [pdict, state])。定制服务器的状态显示。

 

给进程命名

  启动服务器的时候加上 name:参数 。

{ :ok, pid } = GenServer.start_link(Sequence.Server, 100, name::seq)
GenServer.call(:seq, :next_number)

 

整理接口

  

defmodule Sequence douse GenServerdef start_link(current_number) doGenServer.start_link(__MODULE__, current_number, name: __MODULE__)enddef next_number doGenServer.call __MODULE__, next_numberenddef increment_number(delta) doGenServer.call __MODULE__, {:increment_number, delta}enddef handle_call( :next_number, _from, current_number) do{ :reply, current_number, current_number + 1}enddef handle_cast({:increment_number, delta}, current_number) do{ :noreply, current_number + delta}end
end

 

转载于:https://www.cnblogs.com/lr1402585172/p/11512363.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/384197.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

洛谷P1040-加分二叉树-dp+二叉树

P1040-加分二叉树 这道题放在深度优先搜索的训练题中,可是我实在没有看出来应该怎么搜索。看了题解以后才看出来是一个很简单的dp(我果然还是太菜了) 看出dp并且算出来最大的分数不是很复杂,关键是输出给定中序遍历序列的二叉树的先序遍历,要…

UNIX网络编程:I/O复用技术(select、poll、epoll)

http://blog.csdn.net/dandelion_gong/article/details/51673085 Unix下可用的I/O模型一共有五种:阻塞I/O 、非阻塞I/O 、I/O复用 、信号驱动I/O 、异步I/O。此处我们主要介绍第三种I/O符复用。 I/O复用的功能:如果一个或多个I/O条件满足(输…

解决iex -S mix报错

执行iex -S mix命令的时候会遇到如下错误: 执行 mix deps.get 然后就可以运行 iex -S mix了 其中,有可能会出现 按照其网站下载相应文件,复制到项目根目录下,然后执行命令(mix local.rebar rebar ./rebar)即…

贪心算法——选择不相交区间问题

题目描述&#xff1a;设有n个活动的集合&#xff0c;其中每个活动都要求使用同一个资源&#xff0c;而在同一时间内只有一个活动能够使用这一资源&#xff0c;每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi(si<fi)&#xff0c;如果选择了活动i&#xff0c;则…

Anker—工作学习笔记

http://www.cnblogs.com/Anker/archive/2013/08/17/3263780.html 1、基本知识 epoll是在2.6内核中提出的&#xff0c;是之前的select和poll的增强版本。相对于select和poll来说&#xff0c;epoll更加灵活&#xff0c;没有描述符限制。epoll使用一个文件描述符管理多个描述符&am…

Supervisor监控

可参考&#xff1a;https://www.cnblogs.com/wang_yb/archive/2016/06/08/5564459.html &#xff1a;https://segmentfault.com/a/1190000007379204 转载于:https://www.cnblogs.com/lr1402585172/p/11551488.html

深度搜索剪枝——数的划分

【题目描述】将整数n分成k份&#xff0c;且每份不能为空&#xff0c;问有多少种分法&#xff1f; 【输入格式】两个整数n,m(6<n<200,2<m<6) 【输出格式】输出不同的分法数 【样例输入】7 3 【样例输出】4 对于这种搜索题&#xff0c;关键就在于剪枝&#xff1a;确定…

Linux网络编程——tcp并发服务器(I/O复用之select

http://blog.csdn.net/lianghe_work/article/details/46519633 与多线程、多进程相比&#xff0c;I/O复用最大的优势是系统开销小&#xff0c;系统不需要建立新的进程或者线程&#xff0c;也不必维护这些线程和进程。 代码示例&#xff1a; [csharp] view plaincopy #include &…

ets

:ets.new(table_name, pattern) 第一个参数是表名&#xff0c;第二个参数是表的设置选项。 :set  一个key&#xff0c;一个数据&#xff0c;无序 :ordered_set  一个key&#xff0c;一个数据&#xff0c;有序&#xff1b; 1 1.0 :bag  一个key&#xff0c;多个数据&…

贪心算法-区间选点问题-种树

【题目描述】一条街道的一边有几座房子。因为环保原因居民想要在路边种些树&#xff0c;路边的地区被分割成n块&#xff0c;并被编号为1~n。每块大小为一个单位尺寸且最多可总一棵树。每个居民想在门前种些树并制定了三个数b,e,t&#xff0c;这三个数代表居民想在b和e之间最少种…

ets注意事项

当表类型为 :set 时&#xff0c;使用 :ets.first 和 :ets.last 会获取到同一个 key。将表类型换为 :oedered_set 就可以避免这种情况 转载于:https://www.cnblogs.com/lr1402585172/p/11599219.html

CodeForces - 1141CPolycarp Restores Permutation搜索+剪枝

Polycarp Restores Permutation 【题意分析】题意大概是给定一个串&#xff0c;包含从1到n所有的数字。但是给定的是相邻数字的差&#xff0c;需要复原这个串。 大概分析以后发现给定的是一个差分数组&#xff0c;所以只需要枚举第一个元素就可以确定所有元素的值。 问题是如何…

CodeForces - 1141ESuperhero Battle简单模拟

Superhero Battle 这道题卡了我一个多小时&#xff0c;最后也没有做出来&#xff0c;成功称为吊车尾。。。 思路什么的都没有问题&#xff0c;主要是&#xff0c;爆long long了&#xff0c;这个太可怕了&#xff0c;就因为一个中间变量忘记开longlong导致一直一直wa&#xff0c…

Linux下的I/O复用与epoll详解

http://www.cnblogs.com/lojunren/p/3856290.html 前言 I/O多路复用有很多种实现。在linux上&#xff0c;2.4内核前主要是select和poll&#xff0c;自Linux 2.6内核正式引入epoll以来&#xff0c;epoll已经成为了目前实现高性能网络服务器的必备技术。尽管他们的使用方法不尽相…

校门外的树——树状数组+区间修改

校门外的树 【题目分析】题目描述的是一种区间修改&#xff0c;看起来好像要用线段树。但是对于这种区间内部没有差别并且查询的是区间内的类别的问题&#xff0c;是可以转化为树状数组进行的。毕竟树状数组更加简单。 我们的关注点应该放在区间的端点处&#xff0c;然后通过统…

数据结构--顺序栈和链式栈

http://www.cnblogs.com/jingliming/p/4602458.html 栈是一种限定只在表尾进行插入或删除操作,栈也是线性表表头称为栈的底部,表尾称为栈的顶部,表为空称为空栈&#xff0c;栈又称为后进先出的线性表,栈也有两种表示:顺序栈与链式栈顺序栈是利用一组地址连续的存储单元&#xf…

CodeForces - 1144F搜索+简单图论

【题目链接】Graph Without Long Directed Paths 【题目分析】题目想要讲一个无向图变成一个最长路径不超过1的有向图。假如某个边是从u到v的&#xff0c;那么所有和v相连的都必须是指向v的&#xff0c;所有和u相连的都必须是从u开始的。相当于涂色&#xff0c;相连的节点应该涂…

数据结构--双链表的创建和操作

http://www.cnblogs.com/jingliming/p/4602144.html#0-tsina-1-42616-397232819ff9a47a7b7e80a40613cfe1 一、双向链表的定义 双向链表也叫双链表&#xff0c;是链表的一种&#xff0c;它的每个数据结点中都有两个指针&#xff0c;分别指向直接后继和直接前驱。所以&#xff0c…

CodeForces - 1152B二进制+思维

【题目链接】Neko Performs Cat Furrier Transform 【题目分析】要求将一个数字变成2n-1,通过尝试我们发现如果将最低位的全零位和对应的全一数字&#xff08;例如11000对应的就是111&#xff09;异或那么数字就会变成想要的结果&#xff08;11111&#xff09; 但是如果前面还有…

C语言文件操作之fgets()

http://blog.csdn.net/daiyutage/article/details/8540932 来说一说fgets(..)函数。 原型 char * fgets(char * s, int n,FILE *stream); 参数&#xff1a; s: 字符型指针&#xff0c;指向存储读入数据的缓冲区的地址。 n: 从流中读入n-1个字符 stream &#xff1a; 指向读取…