80 lines
2.2 KiB
Python
80 lines
2.2 KiB
Python
import threading
|
|
|
|
import logging
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class CpuUsageThread(threading.Thread):
|
|
sharedInstance = None
|
|
creationLock = threading.Lock()
|
|
|
|
@staticmethod
|
|
def getSharedInstance():
|
|
with CpuUsageThread.creationLock:
|
|
if CpuUsageThread.sharedInstance is None:
|
|
CpuUsageThread.sharedInstance = CpuUsageThread()
|
|
return CpuUsageThread.sharedInstance
|
|
|
|
def __init__(self):
|
|
self.clients = []
|
|
self.doRun = True
|
|
self.last_worktime = 0
|
|
self.last_idletime = 0
|
|
self.endEvent = threading.Event()
|
|
self.startLock = threading.Lock()
|
|
super().__init__()
|
|
|
|
def run(self):
|
|
logger.debug("cpu usage thread starting up")
|
|
while self.doRun:
|
|
try:
|
|
cpu_usage = self.get_cpu_usage()
|
|
except:
|
|
cpu_usage = 0
|
|
for c in self.clients:
|
|
c.write_cpu_usage(cpu_usage)
|
|
self.endEvent.wait(timeout=3)
|
|
logger.debug("cpu usage thread shut down")
|
|
|
|
def get_cpu_usage(self):
|
|
try:
|
|
f = open("/proc/stat", "r")
|
|
except:
|
|
return 0 # Workaround, possibly we're on a Mac
|
|
line = ""
|
|
while not "cpu " in line:
|
|
line = f.readline()
|
|
f.close()
|
|
spl = line.split(" ")
|
|
worktime = int(spl[2]) + int(spl[3]) + int(spl[4])
|
|
idletime = int(spl[5])
|
|
dworktime = worktime - self.last_worktime
|
|
didletime = idletime - self.last_idletime
|
|
rate = float(dworktime) / (didletime + dworktime)
|
|
self.last_worktime = worktime
|
|
self.last_idletime = idletime
|
|
if self.last_worktime == 0:
|
|
return 0
|
|
return rate
|
|
|
|
def add_client(self, c):
|
|
self.clients.append(c)
|
|
with self.startLock:
|
|
if not self.is_alive():
|
|
self.start()
|
|
|
|
def remove_client(self, c):
|
|
try:
|
|
self.clients.remove(c)
|
|
except ValueError:
|
|
pass
|
|
if not self.clients:
|
|
self.shutdown()
|
|
|
|
def shutdown(self):
|
|
with CpuUsageThread.creationLock:
|
|
CpuUsageThread.sharedInstance = None
|
|
self.doRun = False
|
|
self.endEvent.set()
|