【问题标题】:Is there anything wrong with a python infinite loop and time.sleep()?python无限循环和time.sleep()有什么问题吗?
【发布时间】:2014-05-16 21:12:41
【问题描述】:

我有一个递归运行的程序,虽然在 95% 的情况下这不是问题,但有时如果我做的事情花费了太长时间,我会达到递归限制。在我努力转换为和迭代代码的过程中,我决定尝试以下方式:

while True:
    do something

    #check if task is done
    if done:
        print 'ALL DONE'
        break
    else:
        time.sleep(600)
        continue

我已经测试了我的代码,它运行良好,但我想知道这种方法是否存在固有的问题?如果运行时间过长,它会吃掉内存或使盒子崩溃吗?

提前致谢!

编辑:

我所说的“做某事”是定期检查日志文件中的某些关键字,因为数据会不断地写入日志文件。一旦编写了这些行,这发生在不同的时间长度,我让脚本执行某些任务,例如将特定行复制到单独的文件中。

我的原始程序有两个函数,一个定期调用自身,直到找到关键字,然后调用“dosomething”函数。完成后的 do something 函数将调用原始函数,这将发生直到任务完成或我达到递归限制

【问题讨论】:

  • 它在做什么?根据您正在做的事情,可能有也可能没有更好的方法。看起来您正在等待某事完成,在这种情况下,您的代码可能会有一个接口自动等待它完成,而无需不断检查进度。
  • 你希望通过睡眠而不是立即返回循环来获得什么?
  • @jwodder 会无缘无故地占用 CPU 时间。
  • do something 是什么?

标签: python time infinite-loop


【解决方案1】:

这种模式本质上没有错。我已经使用 init.d 中的守护程序函数来启动一个非常相似的 python 脚本。只要“做某事”不泄漏,它应该能够永远运行。

【讨论】:

    【解决方案2】:

    我觉得是这样的

     time.sleep()
    

    不会停止递归限制 因为 sleep 只会暂停执行,不会释放任何类型的内存 检查https://docs.python.org/2/library/time.htmlTime.sleep() 描述

    它会暂停操作,但不会做任何内存优化

    【讨论】:

      【解决方案3】:

      您描述的模式很容易实现,但通常不是做事的最佳方式。如果任务在您检查后立即完成,您仍然需要等待 5 分钟才能恢复处理。但是,有时别无选择,只能这样做;例如,如果检测任务是否完成的唯一方法是检查文件是否存在,您可能必须这样做。在这种情况下,时间间隔选择需要平衡“自旋”消耗的 CPU 和等待时间。

      另一种也相当简单的模式是在等待任务完成时简单地阻塞。这是否容易取决于您使用的特定 API。但是这种技术无法扩展,因为所有处理都必须等待单个活动完成。想象一下在加载页面时无法打开新的浏览器选项卡。

      当今的最佳实践通常使用几种异步处理模型中的一种。就像在网站或 GUI 中为鼠标点击等编写事件处理程序一样,您编写一个回调函数来处理处理结果,并将该回调传递给任务。没有 CPU 被浪费,响应立即处理,无需等待。今天,许多框架都支持这种模型。 Tulip 使用actor模型。

      特别是关于递归限制,我认为您的睡眠循环不负责达到堆栈帧限制。也许这是任务本身发生的事情。

      【讨论】:

        猜你喜欢
        • 2020-08-18
        • 1970-01-01
        • 2017-10-02
        • 2011-04-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-28
        • 2016-05-05
        相关资源
        最近更新 更多