如何跟踪GenServer的执行? 长生不老药

本文适合初学者,尤其是已经开始使用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回调。 服务器接收三个参数,并将它们传递给回调定义。

  1. 客户留言
  2. 客户的价格
  3. 服务器的当前状态。

我们只需将包含三个元素{: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}