我在Erlang中编写了一个简单的服务器。这是我的接受循环:
loop(Sock) ->
{ok, Conn} = gen_tcp:accept(Sock),
Handler = spawn(fun () -> handle(Conn) end),
gen_tcp:controlling_process(Conn, Handler),
loop(Sock).
这显然是递归函数。我的问题是:如果越来越多的客户连接,我的功能堆栈会持续多长时间?这会影响我的应用程序的性能吗?
答案 0 :(得分:3)
Erlang处理两种递归函数:
您可以在this link
上了解示例代码的不同之处但是,如果您定义了像
这样的代码,请检查您的代码loop(Sock) ->
{ok, Conn} = gen_tcp:accept(Sock),
gen_tcp:controlling_process(Conn, Handler),
loop(Sock),
spawn(fun () -> handle(Conn) end).
这将是一个递归函数,最终会溢出堆栈,因为最后一行执行它没有调用loop
函数,而是你定义代码的方式
loop(Sock) ->
{ok, Conn} = gen_tcp:accept(Sock),
Handler = spawn(fun () -> handle(Conn) end),
gen_tcp:controlling_process(Conn, Handler),
loop(Sock).
其中最后一个执行代码再次调用loop
函数(它不必是最后一行代码,但它必须是最后执行的函数,它被称为tail recursion
和Erlang在整个地方使用这种机制,它是erlang服务器的基础。
关于erlang中的递归函数何时停止工作的原始问题,这实际上取决于你运行梁机器的方式,在递归函数上定义的代码,并且很可能你不应该担心它,因为如果你错误地编写了一个溢出堆栈的递归函数,它将终止进程,它将被记录,主管将重新启动服务器,最终你会注意到错误并进行修复。