spawn_link正在启动一个无限循环,但不会返回?

时间:2014-04-18 10:51:17

标签: erlang spawn

我有一个init函数,我称之为start_server:

start_server() ->
    spawn_link(game_loop(0,0)).

目的是启动一个新流程,开始循环并等待某人在那里发送消息:

game_loop(X,Y) ->
receive
{move, left} ->
    tell_client(X+1,Y),
    game_loop(X+1,Y);

{move, right} ->
    tell_client(X-1,Y),
    game_loop(X-1,Y)
end.

我认为start_server会返回Pid,以便我可以在Erlang终端中写出这样的内容:

> Server = server:start_server().

然后使用变量Server通过以下函数处理服务器:

move_left(Pid) ->
    Pid ! {move, left}.

但是这不起作用,因为start_server()永远不会返回,为什么会这样?

1 个答案:

答案 0 :(得分:6)

函数spawn_link/1将函数作为参数。但是在你的代码中你没有将函数传递给它:

start_server() ->
    spawn_link(game_loop(0,0)).

该示例意味着将首先调用函数game_loop/2,并且在返回spawn_link/1之后将调用函数,该参数是调用game_loop/2的结果。但是你的函数game_loop/2实现了无限循环,所以它永远不会返回,所以永远不会调用spawn_link/1。如果我们甚至假设game_loop/2返回它必须返回一个函数来正确调用spawn_link/1,否则异常会上升。

要做你想做的事,你应该将game_loop/2作为一个函数传递给spawn_link/1

start_server() ->
    spawn_link(fun () -> game_loop(0,0) end).