本文适合初学者,尤其是已经开始使用GenServer
。
今天,您将要构建OTP服务器,并使用简单的技术来跟踪服务器。 这不是一种技术,它是调用start_link/3
函数时的一个选项。
谈话很便宜,让我们对其进行编码。
我们在这里做什么?
我们一起实现STACK服务器,并将跟踪该服务器。
如您所知,堆栈是基于先进先出或先进先出概念的数据结构。
我将尽力简化这一过程,而不必过多地研究工程。 我们的最终目标是了解概念。
stack.ex
使用您喜欢的编辑器创建文件stack.ex
。 在这里,我用vim
$ vim stack.ex
在Elixir中,我们通常用文件名来命名模块。 避免混淆是一般惯例。 因此,使用以下代码创建一个名为Stack
的模块。
我们的Stack
服务器非常简单。 尽管如此,关于代码的描述还是有几句话。
请注意,它不是生产等级代码。 我在列表末尾使用了列表 串联 。 通过将元素添加到[ new_elem |state]
类的头部可以更好地执行,但是,您需要更改一些代码逻辑。 因此,我这样做的目的是为了使元素的想法在最后一个位置添加,并首先弹出它。 在生产代码中,由于elixir中的列表实现了linked_lists行为,因此您需要颠倒逻辑。
感谢Hubert Pompecki注意到这一点,因为这可能会导致指导初学者的遗漏。
use GenServer
第一行代码通常会将OTP GenServer行为添加到我们的模块Stack
。 这也意味着我们不必在模块中定义每个回调-行为将为它们定义默认值。 我们可以覆盖我们需要的东西。
当客户端使用GenServer.call
发出同步请求时,将在我们的GenServer
触发与模式匹配的handle_call
回调。 服务器接收三个参数,并将它们传递给回调定义。
- 客户留言
- 客户的价格
- 服务器的当前状态。
我们只需将包含三个元素{:reply, , }
的元组返回给OTP。 Otp将返回给客户端。
这就是流程的方式。
客户端-> GenServer-> OTP->客户端
还有其他回调函数。 我不能在这里解释它们。 您可以自己阅读。
执行与追踪
在运行以下命令之前,请确保您位于文件stack.ex
所在的目录中。
$ iex stack.ex
它打开交互式shell环境,并加载模块Stack
。
启动服务器并使用调试选项启用跟踪
iex> {:ok,pid} = GenServer.start_link(Stack,[1,2,3,4,5],[debug:[:trace]])
GenServer.start_link
第三个参数采用几个选项。 因此,我们使用debug: [:trace]
进行调试。 此选项会将所有消息流记录到控制台。 它清楚地为您提供信息,例如谁向谁发送消息以及向谁发送消息。
致电服务器尝试一下。
获取状态
iex> GenServer.call pid,:get
弹出讯息
iex> GenServer.cast pid,:pop
放留言
iex> GenServer.cast pid,{:put,6}