Erlang并发编程:进程生成、错误处理与容错机制
1. 尾递归函数
尾递归是一种特殊的递归形式,在每次处理完消息后立即再次调用自身。这种方式可以避免栈空间的无限增长,因为编译器可以将最后一个函数调用替换为简单的跳转。
以下是一个尾递归函数的示例:
{From, Other} ->
From ! {self(), {error,Other}},
loop()
end.
在这个例子中,每次接收到消息后,处理消息并调用 loop()
函数。由于 loop()
是最后一个操作,编译器可以优化这个调用,避免栈空间的消耗。
然而,如果在调用 loop()
之后还有其他操作,就会出现问题。例如:
loop() ->
{From, {rectangle, Width, Ht}} ->
From ! {self(), Width * Ht},
loop(),
someOtherFunc();
{From, {circle, R}} ->
From ! {self(), 3.14159 * R * R},
loop();
...
end
在这个错误的代码中,调用 loop()
后还需要调用