要监视python脚本正在使用的系统资源并在资源使用量超过某个预定值时终止它,“正确”或“最佳”的方法是什么?在我的例子中,内存使用是一个值得关注的问题。虽然我对建议持开放态度,但我并不是在问如何衡量系统资源的使用。
作为一个简单的例子,让我们假设我有一个函数,它找到小于某个大数的质数,并根据某种条件将它们添加到一个列表中。我事先不知道有多少质数会满足这个条件,所以如果我使用了最多的系统内存(比如8 8gb),我应该确保终止函数。我知道有一些方法可以监控python对象的大小。我不知道的是,监控列表大小和退出的正确方法是在主函数循环中只包含一个大小测试,如果它超过8 8gb,或者是否有“外部”(外部,我指的是在循环外部,但仍然在python脚本中或部分)的方式来监控和退出。
在我的例子中,我是在mac上运行的,但我通常会问这个问题。
发布于 2010-04-04 14:19:12
在类Unix系统上,监视任何进程的一个有用的“外部”方法是ulimit命令(您不需要澄清是否要在ulimit
中运行,因为Window不存在,其他方法可能存在,但我不知道它们;-)。
如果您正在考虑在自己的Python程序中执行这样的控制,只需更改相关的函数,以检查它附加到列表中的每个对象的大小(并保持运行总数),并在运行总数达到或超过阈值时返回(您可以将其作为一个额外的参数传递给相关函数)。
编辑:OP在一条评论中澄清,他们希望将监视放在最糟糕的位置--在前面的段落中,我提到了在进程外很容易,在函数内部很容易,但是OP希望它“位于中间”;-)。
最不坏的方法可能是使用“看门狗线程”--一个在无限循环中的独立守护线程,它每隔X
秒检查进程的资源消耗(例如,使用resource.getrusage,如果在类Unix的机器上,同样,如果在windows机上,则需要其他线程),如果消耗超过所需的限制,则尝试用thread.interrupt_main杀死主线程。当然,这不是万无一失的:周期性X
(就像所有“轮询”的情况一样)必须足够低,以便在此期间停止失控的进程,但又必须足够高,以避免将进程减慢为爬行。此外,主线程(唯一可以像这样被中断的线程)可能是阻塞异常(在这种情况下,监视线程可能会尝试使用日益严重的“这个进程的信号”,一直到SIGKILL
,这是永远不会被阻塞或拦截的杀手级信号)。
因此,与ulimit
命令相比,这种中间方法的工作量要大得多,而且更加脆弱,并且没有实质性的附加值。但是,如果您想要将监视放在“进程内但在资源消耗函数之外”,而没有任何优点、大量工作以及我前面提到的其他缺点,这就是实现此目的的方法。
发布于 2010-04-04 21:57:44
resource.getrusage()
(尤其是ru_idrss
)可以向您提供当前python
解释器的资源使用情况,您可以将其用作停止处理的前哨。
https://stackoverflow.com/questions/2573736
复制相似问题