Erlang 和 OTP in Action:为啥不能在 telnet 中调用 get_count?

Posted

技术标签:

【中文标题】Erlang 和 OTP in Action:为啥不能在 telnet 中调用 get_count?【英文标题】:Erlang and OTP in Action: why cannot call get_count in telnet?Erlang 和 OTP in Action:为什么不能在 telnet 中调用 get_count? 【发布时间】:2015-11-03 13:07:52 【问题描述】:

在书"Erlang and OTP in Action",第3章,有一个tr_server example。我对此有一些疑问:

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

    还有,tr_servergen_servererl consoletelnet之间是什么关系?

【问题讨论】:

【参考方案1】:

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

关于第二个问题:

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

Erlang shell 实现了一个读取-评估-打印循环 (REPL)。它以 Erlang 函数调用和它自己的 shell 命令的形式接受来自用户的输入,执行它们,并将结果呈现给用户。 tr_server 与 shell 类似,但 shell 更强大、更全面。

Telnet 是一种古老但仍然有效的交互式访问远程 Internet 主机的方法。阅读链接了解更多详情。

【讨论】:

谢谢。您能否提供有关“erlang shell 和 gen_server 之间的关系”的更多详细信息?在 Unix shell 中,它执行一个命令可能会派生一个新进程,但在 erlang shell 中,如果我们执行一个命令会发生什么? 在Erlang shell中调用函数意味着该函数运行在shell进程中。如果该函数导致进程终止,那么一个新的 shell 进程将取而代之。您可以在 shell 中看到这一点,首先调用函数 self(). 以获取当前 shell 进程的 pid,然后运行将终止该进程的函数,例如 exit(foo).,然后再次调用 self().。您会看到第二次调用 self(). 返回的 pid 与第一次不同。 @songhir 当你从 shell 中spawn_link 时,关于在 shell 进程中运行的函数最有趣的事情发生了——然后 shell 的进程与你生成的任何东西相关联。当那个东西崩溃时,shell 的当前进程也会崩溃。但是 shell 也受到监督,因此崩溃不会出现杀死 shell,因为它会立即启动。在您玩耍时,您最终会因此在 shell 中遇到一些看起来很时髦的东西。请记住,“shell 也是一个进程”。

以上是关于Erlang 和 OTP in Action:为啥不能在 telnet 中调用 get_count?的主要内容,如果未能解决你的问题,请参考以下文章

SOA:为啥不使用 Erlang/OTP Web 服务器作为服务?

难以理解 Erlang Gen_Server 架构

Erlang/OTP 发布和 LTS 时间表是啥?

Erlang/OTP 升级丢失现有的 RabbitMQ 消息

初学者的 Erlang/OTP 行为

1.Erlang/OTP平台