我有一个递归运行的程序,虽然95%的情况下这不是问题,但如果我做的事情花费的时间太长,有时我会遇到递归限制。在我努力转换为迭代代码的过程中,我决定尝试以下内容:
while True:
do something
#check if task is done
if done:
print 'ALL DONE'
break
else:
time.sleep(600)
continue
我已经测试了我的代码,它工作得很好,但我想知道是否有什么固有的错误与这种方法?如果让它运行太长时间,它会耗尽内存或使机器崩溃吗?
提前感谢!
编辑:我所说的"做点什么"是指定期检查日志文件中的某些关键字,因为数据不断被写入日志文件。写完这些行之后(时间长短不一),我让脚本执行某些任务,比如将特定的行复制到单独的文件中。
我原来的程序有两个函数,一个周期性地调用自己,直到找到关键字,然后调用"做点什么"函数。完成后的do something函数将调用原始函数,直到任务完成或达到递归限制
这个模式本身并没有什么错误。我在init中使用了守护进程函数。D启动一个非常相似的python脚本。只要"做某事"不泄漏,它应该能够永远运行。
我认为无论如何
time.sleep()
不会停止递归限制因为睡眠只是暂停执行,并没有释放任何类型的内存查看https://docs.python.org/2/library/time.html Time.sleep()的描述
暂停操作,但不做任何内存优化
您描述的模式很容易实现,但通常不是最好的方法。如果任务在您检查后刚刚完成,您仍然需要等待5分钟才能恢复处理。然而,有时别无选择,只能这样做;例如,如果检测任务是否完成的唯一方法是检查文件是否存在,那么您可能必须这样做。在这种情况下,时间间隔的选择需要平衡"旋转"所消耗的CPU与等待时间。
另一个相当简单的模式是在等待任务完成时简单地阻塞。这是否容易取决于您正在使用的特定API。但是这种技术不能扩展,因为所有处理都必须等待单个活动完成。想象一下,当页面正在加载时,无法打开一个新的浏览器选项卡。
目前的最佳实践通常使用异步处理的几种模型之一。就像在网站或GUI中为鼠标点击等编写事件处理程序一样,您可以编写一个回调函数来处理处理结果,并将该回调函数传递给任务。没有CPU被浪费,响应被立即处理而不需要等待。现在许多框架都支持这个模型。Tulip使用actor模型。特别是关于递归限制,我不认为你的睡眠循环是负责达到堆栈帧限制。