【问题标题】:Accessing CPU/RAM usage (like with Task Manager, but via API!)?访问 CPU/RAM 使用情况(如使用任务管理器,但通过 API!)?
【发布时间】:2014-05-27 04:41:24
【问题描述】:

是否有使用 Windows API 访问“任务管理器”信息的特定方法?我已经对此事进行了相当多的搜索,但似乎也找不到可以告诉我的 API 调用:

  • 给定进程的 CPU/RAM 使用率
  • 使用最多 CPU/RAM 的进程

有没有办法通过 Python 或 C++(基本上是通过 Windows API)访问这些信息?

这就是我实际上想要做的事情(在伪代码中):

app x = winapi.most_intensive_process
app y = winapi.most_RAM_usage

print x.name
print y.name

【问题讨论】:

    标签: python c++ windows winapi


    【解决方案1】:

    您可以使用psutil 库来代替直接调用Windows API,它是一个提供大量进程信息的跨平台库。 它适用于 Windows、Linux、Mac OS、BSD 和 Sun Solaris,并适用于 2.4 到 3.4 的 32 位和 64 位方式的 python。

    特别是它的Process 类有以下有趣的方法:

    • cpu_times:进程从一开始就花费的用户和系统时间。
    • cpu_percent: 自上次调用或在给定时间间隔内的 CPU 利用率百分比
    • memory_info:有关 Ram 和虚拟内存使用情况的信息。 注意:文档明确指出这些是 taskmgr.exe 显示的,因此看起来正是您想要的。
    • memory_info_ex:扩展内存信息。
    • memory_percent: 进程使用内存的百分比。

    要遍历所有进程(例如,为了找到最需要 CPU/内存的进程),您可以遍历 process_iter


    这是您想要实现的目标的简单实现:

    import psutil
    
    def most_intensive_process():
        return max(psutil.process_iter(), key=lambda x: x.cpu_percent(0))
    
    def most_RAM_usage():
        return max(psutil.process_iter(), key=lambda x: x.memory_info()[0])
    
    x = most_intensive_process()
    y = most_RAM_usage()
    
    print(x.name)
    print(y.name)
    

    在我的系统上运行示例:

    In [23]: def most_intensive_process():
        ...:     # psutil < 2.x has get_something style methods...
        ...:     return max(psutil.process_iter(), key=lambda x: x.get_cpu_percent(0))
        ...: 
        ...: def most_RAM_usage():
        ...:     return max(psutil.process_iter(), key=lambda x: x.get_memory_info()[0])
    
    In [24]: x = most_intensive_process()
        ...: y = most_RAM_usage()
        ...: 
    
    In [25]: print(x.name, y.name)
    firefox firefox
    

    【讨论】:

    • 这绝对是最好的答案,但我还有一个额外的问题:psutil 是特定于 Python 的(显然),那么是否有类似的 C/C++ 库? Python 可以很好地满足我的目的,但我目前正在加强我的 C++ 技能,这样的库将非常有用。谷歌搜索“psutil c++ 替代”并没有让我得到任何东西。 :(
    • @b4ux1t3 不幸的是,我不知道任何与 C/C++ 等效的库。您可能应该在Software Recommendations 网站上询问。
    【解决方案2】:

    您可以使用 PSAPI 函数检索有关 RAM 使用情况的信息,尤其是 EnumProcesses 可以找到系统中的所有进程,GetProcessMemoryInfo 可以获取有关每个进程的内存使用情况的信息。

    您可以使用GetProcessTimes 检索每个进程的 CPU 使用率。这并不总是完全准确,但我相信任务管理器在相同情况下以相同方式产生的结果是不准确的。

    如果您需要,可以通过GetPerformanceInfo 获得有关整个系统的内存使用情况的信息。

    【讨论】:

      【解决方案3】:

      您可以使用以下 Windows API 来检索 C/C++ 程序中的各种进程计数器

      它检索有关指定进程的内存使用情况的信息。

      BOOL WINAPI GetProcessMemoryInfo(
        _In_   HANDLE Process,
        _Out_  PPROCESS_MEMORY_COUNTERS ppsmemCounters,
        _In_   DWORD cb
      );
      

      MSDN 上有完整的示例,解释了如何使用它为您的流程检索此类信息。

      http://msdn.microsoft.com/en-us/library/windows/desktop/ms682050%28v=vs.85%29.aspx

      您提到您希望连续获取信息(与任务管理器一样有一定的时间间隔)。为了实现这一点,您可能需要在函数中编写完整的逻辑(在 MSDN 中提到)并在一段时间延迟后调用它(Sleep(1second))。这样你应该能够获取所有这些程序执行前的信息。

      【讨论】:

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