【问题标题】:Monitor and Terminate Python script based on system resource use根据系统资源使用情况监控和终止 Python 脚本
【发布时间】:2010-04-04 06:12:46
【问题描述】:

监视python脚本正在使用的系统资源并在资源使用超过某些预定值时终止它的“正确”或“最佳”方法是什么。在我的情况下,内存使用是值得关注的。尽管我愿意接受建议,但我并不是在问如何衡量系统资源使用情况。

作为一个简单的例子,假设我有一个函数可以找到小于某个大数的素数,并根据某些条件将它们添加到列表中。我事先不知道有多少质数会满足条件,所以如果我使用最多的系统内存(比如说 8gb),我要确保终止函数。 我知道有一些方法可以监控 python 对象的大小。我不知道监视列表大小和退出的正确方法是在主函数循环中包含一个大小测试,如果它超过 8gb 或者如果有一个“外部”(我的意思是外部在循环外部但仍然在 python 脚本内或部分)监视和退出的方式。

在我的情况下,我在 Mac 上运行,但一般都在问这个问题。

【问题讨论】:

  • 这不是叫“设计”吗?为什么不设计一个使用最少内存的算法呢?我不确定我是否理解这个用例与设计有何不同。你能解释一下为什么你没有设计算法来最小化内存使用吗?
  • @S.Lott:我想问一个一般性问题。在我的实际用例中,我不确定我的列表会有多大或实验将运行多长时间。我希望它需要几天才能运行,因为我从中选择数字的迭代器很大。有时,即使是一个好的算法,在实际运行之前,其运行时间和内存使用情况也是不确定的。

标签: python resources monitoring terminate


【解决方案1】:

在类 Unix 系统上,监视任何进程的有用“外部”方法是 ulimit 命令(您没有说明是否要改为在 Windows 中运行,其中 ulimit 不存在和其他方法可能,但我不知道它们;-)。

如果您正在考虑在自己的 Python 程序中执行此类控制,只需更改相关函数以检查它附加到列表中的每个对象的大小(并保持运行总数)并在运行总数达到时返回或超过阈值(您可以将其作为额外参数传递给相关函数)。

编辑:OP 在评论中澄清说,他们希望将监控放在可能放置的最糟糕的地方——在前面的段落中,我提到了在流程之外它是多么容易,在函数内部很容易,但是 OP 希望它“在中间”;-)。

最糟糕的方法可能是使用“看门狗线程”——一个无限循环中的单独守护线程,每隔X 秒,检查进程的资源消耗(例如,使用resource.getrusage,如果在类 Unix 上机器——同样,如果在 Windows 上,则需要其他东西)并且,如果该消耗超过所需的限制,则尝试使用 thread.interrupt_main 终止主线程。当然,这是万无一失的失败:周期性X(就像在所有“轮询”情况下一样)必须足够低以同时停止失控的进程,但又足够高以不会减慢进程到爬行。另外,主线程(唯一可以像这样被中断的线程)可能正在阻塞异常(在这种情况下,看门狗线程可能会尝试使用越来越严重的“信号给这个进程”,一直到SIGKILL ,永远无法阻挡或拦截的杀手信号)。

因此,这种中间方法比ulimit 命令要做更多的工作,更脆弱,并且没有实质性的附加值。但是,如果你想把监控放在“进程内部,资源消耗功能之外”,没有优点,工作量大,还有我提到的其他缺点,这就是这样做的方法。

【讨论】:

  • (外部是指在循环外部,但仍在 python 脚本内或部分)
  • @Vincent,你可能把它放在最糟糕的地方——我提到它在过程之外很容易,在函数内部很容易,但你希望它在中间;-)。好的,让我编辑 A 以提及一种可能性。
  • 我一定很不清楚,我希望它在最好的地方,只要它会自行终止。循环内或循环外。我只是不知道选择“看门狗线程”而不是其他任何原因的原因。感谢您的帖子
  • @Vincent,根据我的 A 的第 1 段,“最好的地方”在 Python 进程之外(通过使用ulimit 设置进程的限制),第二好在函数中,按照它的第 2 段段落;如果您不想检查我已经解释过的任何地方,那么“看门狗线程”是剩下的最糟糕的选择,我在编辑后的第 4 段中解释了这一点。由于您认为我的回答不好,您肯定还有其他想法,但是我们已经没有地方可以放置监控功能了!-)
【解决方案2】:

resource.getrusage()(特别是ru_idrss)可以为您提供当前python解释器的资源使用情况,您可以将其用作停止处理的哨兵。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多