psutil - A cross-platform process and system utilities module for Python
pip 安裝即可。
windows 下需要安裝 vs2008,否則報(bào)錯(cuò):?Unable to find vcvarsall.bat?
如果已經(jīng)安裝 vs2010 / vs2012 則需要設(shè)置環(huán)境變量,VS90COMNTOOLS 指向已有的 vs 變量。
vs2010 設(shè)置如下:
VS90COMNTOOLS = %VS100COMNTOOLS%
# -*- coding: utf-8-*-import psutildef get_proc_by_id(pid): return psutil.Process(pid)def get_proc_by_name(pname): """ get process by name return the first process if there are more than one """ for proc in psutil.process_iter(): try: if proc.name().lower() == pname.lower(): return proc # return if found one except psutil.AccessDenied: pass except psutil.NoSuchProcess: pass return Noneif '__main__' == __name__: print get_proc_by_name("chrome.exe") print get_proc_by_id(4364)
不同的進(jìn)程,權(quán)限等信息可能不同,遍歷所有進(jìn)程取信息時(shí),需要對(duì)每一個(gè)進(jìn)程單獨(dú)進(jìn)程異常保護(hù)。
大多數(shù) demo 代碼中,都是使用??psutil.get_process_list?,但該方法在源碼中已經(jīng)標(biāo)記為廢棄。
新推薦的是??psutil.process_iter?迭代器。
根據(jù)下面的源碼可知實(shí)現(xiàn)原理:獲取所有進(jìn)程 ID,然后根據(jù) ID 創(chuàng)建進(jìn)程對(duì)象。
_pmap = {}def process_iter(): """Return a generator yielding a Process class instance for all running processes on the local machine. Every new Process instance is only created once and then cached into an internal table which is updated every time this is used. Cached Process instances are checked for identity so that you're safe in case a PID has been reused by another process, in which case the cached instance is updated. The sorting order in which processes are yielded is based on their PIDs. """ def add(pid): proc = Process(pid) _pmap[proc.pid] = proc return proc def remove(pid): _pmap.pop(pid, None) a = set(get_pid_list()) b = set(_pmap.keys()) new_pids = a - b gone_pids = b - a for pid in gone_pids: remove(pid) for pid, proc in sorted(list(_pmap.items()) list(dict.fromkeys(new_pids).items())): try: if proc is None: # new process yield add(pid) else: # use is_running() to check whether PID has been reused by # another process in which case yield a new Process instance if proc.is_running(): yield proc else: yield add(pid) except NoSuchProcess: remove(pid) except AccessDenied: # Process creation time can't be determined hence there's # no way to tell whether the pid of the cached process # has been reused. Just return the cached version. yield proc@_deprecated()def get_process_list(): """Return a list of Process class instances for all running processes on the local machine (deprecated). """ return list(process_iter())
VSS 是剩余的可訪問內(nèi)存。
進(jìn)程占用內(nèi)存包括 2 部分,自身 共享庫。不同的算法產(chǎn)生了 3 個(gè)不同的內(nèi)存指標(biāo),分別是:RSS / PSS / USS。
一般來說內(nèi)存占用大小有如下規(guī)律:VSS >= RSS >= PSS >= USS
?
Demo 代碼如下
proc = psutil.Process(4364)total = psutil.virtual_memory().totalrss, vss = proc.memory_info()percent = proc.memory_percent()print "rss: %s Byte, vss: %s Byte" % (rss, vss)print "total: %.2f(M)" % (float(total)/1024/1024/1024)print "percent: %.2f%%, calc: %.2f%%" % (percent, 100*float(rss)/total)
輸出
本機(jī)內(nèi)存信息截圖
詳細(xì)說明:
轉(zhuǎn)載于:https://www.cnblogs.com/misspy/p/3851327.html
來源:https://www.icode9.com/content-3-271401.html聯(lián)系客服