设为首页 收藏本站
查看: 1200|回复: 0

[经验分享] python在windows系统中获取进程的cpu占用率

[复制链接]

尚未签到

发表于 2015-4-20 13:39:32 | 显示全部楼层 |阅读模式
python获取进程cpu的占有率:  一种方法是利用windows的wmi接口。由于任务比较紧,另外不知道怎么地在本机上测试总是没有成功。可能是python调用的借口有问题。
  索性弃之不用,用第二种方法。
  第二种方法是给python写扩展,此处用到的是c++,采用boost python。毕竟自己搞windows编程的时间比较长,用api什么的比较顺手。
  至于怎么写扩展,我会在下一篇文章中提到。网上也有很多教程。
  1、先写windows的dll代码如下:




  1 #include "stdafx.h"
  2 #include "windows.h"
  3 #include
  4 #include
  5 #include  
  6 #include
  7
  8  #pragma comment(lib, "psapi.lib")
  9
10  //定义获取CPU负载的结构体
11 typedef struct _THREAD_INFO
12 {
13 LARGE_INTEGER CreateTime;
14 DWORD dwUnknown1;
15 DWORD dwStartAddress;
16 DWORD StartEIP;
17 DWORD dwOwnerPID;
18 DWORD dwThreadId;
19 DWORD dwCurrentPriority;
20 DWORD dwBasePriority;
21 DWORD dwContextSwitches;
22 DWORD Unknown;
23 DWORD WaitReason;
24
25 }THREADINFO, *PTHREADINFO;
26
27 typedef struct _UNICODE_STRING
28 {
29 USHORT Length;
30 USHORT MaxLength;
31 PWSTR Buffer;
32 } UNICODE_STRING;
33
34 typedef struct _PROCESS_INFO
35 {
36 DWORD dwOffset;
37 DWORD dwThreadsCount;
38 DWORD dwUnused1[6];
39 LARGE_INTEGER CreateTime;
40 LARGE_INTEGER UserTime;
41 LARGE_INTEGER KernelTime;
42 UNICODE_STRING ProcessName;
43
44 DWORD dwBasePriority;
45 DWORD dwProcessID;
46 DWORD dwParentProcessId;
47 DWORD dwHandleCount;
48 DWORD dwUnused3[2];
49
50 DWORD dwVirtualBytesPeak;
51 DWORD dwVirtualBytes;
52 ULONG dwPageFaults;
53 DWORD dwWorkingSetPeak;
54 DWORD dwWorkingSet;
55 DWORD dwQuotaPeakPagedPoolUsage;
56 DWORD dwQuotaPagedPoolUsage;
57 DWORD dwQuotaPeakNonPagedPoolUsage;
58 DWORD dwQuotaNonPagedPoolUsage;
59 DWORD dwPageFileUsage;
60 DWORD dwPageFileUsagePeak;
61
62 DWORD dCommitCharge;
63 THREADINFO ThreadSysInfo[1];
64
65 } PROCESSINFO, *PPROCESSINFO;
66
67
68 #ifdef _MANAGED
69 #pragma managed(push, off)
70 #endif
71
72 BOOL APIENTRY DllMain( HMODULE hModule,
73                        DWORD  ul_reason_for_call,
74                        LPVOID lpReserved
75                      )
76 {
77     return TRUE;
78 }
79 int GetProessCPU(DWORD dwProcessId)
80 {
81 int nCpuUsage    = 0;
82 DWORD dwInfoSize = 0x20000;
83 PPROCESSINFO pProcessInfo;
84 DWORD dwWorkingSet;
85 long ( __stdcall *NtQuerySystemInformation )( DWORD, PVOID, DWORD, DWORD);
86
87 static __int64 nLastTotalProcessCPUUsage   = 0;
88 static __int64 nLastCurrentProcessCPUUsage = 0;
89 __int64 nTotalProcessCPUUsage   = 0;
90 __int64 nCurrentProcessCPUUsage = 0;
91
92 //
93 PVOID pProcInfo = (PVOID)(new char[dwInfoSize]);
94 NtQuerySystemInformation = (long(__stdcall*)(DWORD,PVOID,DWORD,DWORD))GetProcAddress(GetModuleHandle(L"ntdll.dll"), "NtQuerySystemInformation");
95 NtQuerySystemInformation(5, pProcInfo, dwInfoSize, 0);
96 pProcessInfo = (PPROCESSINFO)pProcInfo;
97 do
98 {
99    nTotalProcessCPUUsage += (__int64)pProcessInfo->KernelTime.QuadPart + (__int64)pProcessInfo->UserTime.QuadPart;
100    if(pProcessInfo->dwProcessID == dwProcessId)
101    {
102     dwWorkingSet = pProcessInfo->dwWorkingSet;
103     nCurrentProcessCPUUsage += (__int64)pProcessInfo->KernelTime.QuadPart + (__int64)pProcessInfo->UserTime.QuadPart;
104    }
105    if(pProcessInfo->dwOffset == 0)
106    {
107     break;
108    }
109    pProcessInfo = (PPROCESSINFO)((char*)pProcessInfo + pProcessInfo->dwOffset);
110 }while(true);
111
112 __int64 nTotalDelta   = nTotalProcessCPUUsage - nLastTotalProcessCPUUsage;
113 __int64 nCurrentDelta = nCurrentProcessCPUUsage - nLastCurrentProcessCPUUsage;
114 if(nTotalDelta > 0 && nCurrentDelta >= 0)
115 {
116    nCpuUsage = int(100 * nCurrentDelta / nTotalDelta);
117 }
118
119 nLastTotalProcessCPUUsage   = nTotalProcessCPUUsage;
120 nLastCurrentProcessCPUUsage = nCurrentProcessCPUUsage;
121 delete[] pProcInfo;
122
123 return nCpuUsage;
124 }
125
126 BOOST_PYTHON_MODULE(cpudll)
127 {
128     using namespace boost::python;
129     def("GetProessCPU",GetProessCPU);
130 }
131
132 #ifdef _MANAGED
133 #pragma managed(pop)
134 #endif
  生成dll后。把后缀名改为pdy就可以import了。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-58924-1-1.html 上篇帖子: 如何查看python selenium的api 下篇帖子: k-means聚类算法python实现
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表