尾递归和内存泄漏
2012-04-23 23:47 rhinovirus 阅读(809) 评论(0) 收藏 举报尾递归在并发编程中的重要性在这里变得很明显。因为你不知道将会调用多少次这个函数,你必须确保它在常量的内存空间内执行,
当每次处理一个消息的时候不会增加递归调用堆栈。每分钟处理数千次以上的消息,且持续数小时,数天,数月或者数年都是很常见的!
使用尾递归,接受/计算函数的最后一件事是调用自己,这样你就可以确保没有内存泄漏地不间断运行了。
当一个消息和receive声明中的所有语句都不匹配的时候会发生什么呢?它会无限制地停留在信箱中,这就造成了内存泄漏,随着时间
的推移这还可能导致运行时系统内存溢出和崩溃。因此不处理未知消息应视为一个错误。要么刚开始就不应该发送这些消息到这个进程,
要么处理它们,可能只是从信箱中取出并忽略掉。
忽视未知消息的防御性办法是在receive语句中使用 “无关紧要” 变量,虽然这个方法很方便,但它可能并不是一个最好的办法。首先没有被
处理的消息也许就不应该发送到这个进程。如果它们是有意发送的,他们可能因为recieve语句中的一个编程错误而不能匹配。抛弃这些消息只会
把发现错误变的更困难。如果抛弃了未知的消息,请一定要记录它们的出现,这样做至少以后可以比较容易地发现和纠正这些错误。
摘自 《Erlang编程指南》 114页
本文基于署名-非商业性使用 3.0许可协议发布,欢迎转载,演绎,但是必须保留本文的署名rhinovirus(包含链接http://www.cnblogs.com/rhinovirus/),且不得用于商业目的。如您有任何疑问或者授权方面的协商,请与我联系。
浙公网安备 33010602011771号