python无限循环和time.sleep()有什么问题吗?



我有一个递归运行的程序,虽然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模型。

特别是关于递归限制,我不认为你的睡眠循环是负责达到堆栈帧限制。

最新更新