Erlang和OTP在运行:为什么不能在telnet中调用get_count



在《Erlang and OTP In Action》第3章中,有一个tr_server的例子。我有一些问题:

  1. 为什么在telnet中不能调用tr_server:get_count(). ?书上说,handle_info/2函数将同步调用gen_server:call/2。谁能提供更多有关问题的细节?

  2. 以及tr_servergen_servererl consoletelnet之间的关系

第一个问题的答案在书中第117页,那里有一个单独的框架,名为"服务器不应该调用自己"。问题是,由于代码在gen_server中运行,因此在尝试调用tr_server:get_count()时,它实际上是在自己的消息接收循环中。该函数的实现通过向gen_server发送消息,然后阻塞以等待回复来工作,但是消息循环已经在处理调用tr_server:get_count()的请求的handle_info/2内部阻塞。此时,gen_server进程再次调用自身的任何尝试都会导致死锁。

关于第二个问题:

  • tr_server是用于gen_server的回调模块。标准的gen_server模块实现了一个消息接收循环,处理一些消息本身,特别是系统消息,并调用tr_server模块回调来处理所有其他消息,这些消息是应用程序消息。

  • Erlang shell实现了读取-执行-打印循环(REPL)。它以Erlang函数调用和它自己的shell命令的形式接受来自用户的输入,执行它们,并将结果呈现给用户。

  • tr_server与shell相似,但shell功能更强大,功能更全面。
  • Telnet是一种古老但仍然有效的交互式访问远程internet主机的方式。

最新更新