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