Exemplo n.º 1
0
    def __init__(self, name, group, pid, state, statename, start):
        self.name = name
        self.group = group
        self._pid = pid
        self._state = state
        self._statename = statename
        self.start = start
        self.cpu = []
        self.mem = []
        self.cpu_stats = CPUStats(self.pid)
        self.mem_stats = MemoryStats(self.pid)

        ProcInfo.add(self)
Exemplo n.º 2
0
class ProcInfo(object):
    processes = {}

    def __init__(self, name, group, pid, state, statename, start):
        self.name = name
        self.group = group
        self._pid = pid
        self._state = state
        self._statename = statename
        self.start = start
        self.cpu = []
        self.mem = []
        self.cpu_stats = CPUStats(self.pid)
        self.mem_stats = MemoryStats(self.pid)

        ProcInfo.add(self)

    @property
    def state(self):
        return self._state

    @property
    def statename(self):
        return self._statename
    
    @statename.setter
    def statename(self, val):
        try:
            self._statename = val
            self._state = STATE_MAP[val]
        except Exception as e:
            print(e)

    @property
    def pid(self):
        return self._pid

    @pid.setter
    def pid(self, val):
        self._pid = val
        self.cpu_stats.pid = val
        self.mem_stats.pid = val

    def update(self):
        timestamp = time()
        user_util, sys_util = self.cpu_stats.cpu_percent_change()
        memory_percent = self.mem_stats.memory_percent()
        self.cpu.append([timestamp, user_util])
        self.mem.append([timestamp, memory_percent])
    
    def _binary_search_helper(self, array, value, start, end):
        if (start >= end):
            return end
        else:
            mid = start + (end - start) / 2
            if array[mid][0] > value:
                return self._binary_search_helper(array, value, start, mid)
            else:
                return self._binary_search_helper(array, value, mid + 1, end)

    def _binary_search(self, array, value):
        index = self._binary_search_helper(array, value, 0, len(array))
        return array[index:len(array)]

    def get_cpu(self, time=None):
        if time is None:
            return self.cpu
        else:
            return self._binary_search(self.cpu, time)

    def get_mem(self, time=None):
        if time is None:
            return self.mem
        else:
            return self._binary_search(self.mem, time)

    def __str__(self):
        return 'name: %s, group: %s, pid: %s, cpu: %s, mem: %s' % (self.name, self.group, self._pid, self.cpu, self.mem)

    def to_dict(self):
        return {'name': self.name,
        'group': self.group,
        'pid': self._pid,
        'state': self._state,
        'statename': self._statename,
        'start': self.start,
        'cpu': self.cpu,
        'mem': self.mem,
        }

    @classmethod
    def get(self, group, name):
        try:
            return ProcInfo.processes[group][name]
        except:
            None

    @classmethod
    def add(self, proc):
        if proc.group not in ProcInfo.processes:
            ProcInfo.processes[proc.group] = {}
        ProcInfo.processes[proc.group][proc.name] = proc

    # A class method generator that yields the contents of the 'processes' dictionary
    @classmethod
    def all(self):
        for group in ProcInfo.processes:
            for name in ProcInfo.processes[group]:
                yield ProcInfo.processes[group][name]
        raise StopIteration()

    @classmethod
    def updateall(self):
        for p in ProcInfo.all():
            p.update()

    @classmethod
    def purge(self):
        ProcInfo.processes = {}