二郎。停止进程的正确方法

标签 erlang

美好的一天,我的小服务有以下设置:

-module(mrtask_net).

-export([start/0, stop/0, listen/1]).

-define(SERVER, mrtask_net).

start() ->
    Pid = spawn_link(fun() -> ?MODULE:listen(4488) end),
    register(?SERVER, Pid),
    Pid.

stop() ->
    exit(?SERVER, ok).

....

这是repl摘录:
(emacs@rover)83> mrtask_net:start().
<0.445.0>
(emacs@rover)84> mrtask_net:stop().
** exception error: bad argument
     in function  exit/2
        called as exit(mrtask_net,ok)
     in call from mrtask_net:stop/0
(emacs@rover)85> 

如您所见,停止进程会产生错误,但进程正在停止。
这个错误是什么意思以及如何使事情变得干净?

最佳答案

不是 Erlang 程序员,只是来自 exit 的文档( here ),我想说的是 exit需要一个进程 ID 作为第一个参数,而您正在向它传递一个原子( ?SERVER )。

尝试

exit(whereis(?SERVER), ok).

相反( whereis 返回与名称关联的进程 ID,参见 here )

关于二郎。停止进程的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7970456/

相关文章:

erlang - Mnesia:read、match_object、select和qlc查询的时间和空间效率

java - 为什么说 Erlang 比 Java 和 C++ 更适合网页游戏中的服务器端编程?

testing - 我应该如何测试两个 erlang gen_servers

node.js - 使用 Node.js 和 Nginx 进行负载平衡长轮询请求

Erlang shell - 控制两个进程

sockets - erlang/elixir gen_tcp 连接 - 未连接但 telnet 会

multithreading - 并发: Processes vs Threads

erlang 模板引擎。 sgte、google-cTemplate 或 erlydtl

list - Erlang如何检查元组列表中的所有元素是否存在于另一个元组列表中

erlang - 如何让 Ecto.changeset validate_required 接受空白值?