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

标签 python resources monitoring terminate

监视 python 脚本正在使用的系统资源并在资源使用超过某些预定值时终止它的“正确”或“最佳”方法是什么。在我的例子中,内存使用是一个问题。尽管我乐于接受建议,但我并不是在询问如何衡量系统资源使用情况。

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

就我而言,我在 Mac 上运行,但我问的是一般问题。

最佳答案

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

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

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

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

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

关于python - 根据系统资源使用情况监视和终止 Python 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2573736/

相关文章:

mysql - 如何查找 mysql 上每秒的写入次数?

python - Pandas 不会就地 fillna()

Python sqlite3,从for循环插入数据

c# - 使用资源文件本地化 ASP.NET WebForm 应用程序

java - 使用 Java 监控电子邮件收件箱

c# - 如何使用 c# 监控 SQL Server 表更改?

python - 如何使用kafka.consumer.SimpleConsumer,seek()

python - 如何从 json 文件中读取键值对作为 pandas 数据帧?

java - 从可运行 jar 中的资源文件夹加载 docx 文件

java - 部署到 tomcat 后访问资源文件时出现 FileNotFoundException