根据系统资源使用监视和终止Python脚本

时间:2010-04-04 06:12:47

标签: python resources monitoring terminate

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

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

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

2 个答案:

答案 0 :(得分:2)

在类Unix系统上,监视任何进程的一种有用的“外部”方式是ulimit命令(您不会澄清是否要在Windows中运行,ulimit不能运行存在和其他方法可能,但我不知道; - )。

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

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

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

因此,这种中间方法比SIGKILL命令要多得多,更脆弱,并且没有实质性的附加价值。但是,如果你想把监控“放在流程内但在资源消耗功能之外”,没有任何优势,很多工作,以及我提到的其他缺点,这就是实现它的方法。

答案 1 :(得分:2)

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