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_server
、gen_server
、erl console
和telnet
之间是什么关系?
【问题讨论】:
【参考方案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 服务器作为服务?