X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=pdm%2Fperf.py;h=f0e6c89f8c713e137575107721b15ac796d6d807;hb=9e3c83b113c519d0073457ae0cfe80291bcda7e9;hp=6a68676066ce99b12660202fdb1d93783ffbd7f3;hpb=9b6845a6a793a189bad2788333663ef4407012e1;p=pdm.git diff --git a/pdm/perf.py b/pdm/perf.py index 6a68676..f0e6c89 100644 --- a/pdm/perf.py +++ b/pdm/perf.py @@ -45,7 +45,7 @@ It contains two named PERF objects: - platform -- An attribute returning the Python build platform. """ -import os, sys, resource, time, socket, threading +import os, sys, time, socket, threading __all__ = ["attrinfo", "simpleattr", "valueattr", "eventobj", "staticdir", "event", "procevent", "startevent", @@ -63,7 +63,7 @@ class attrinfo(object): class perfobj(object): def __init__(self, *args, **kwargs): - super().__init__() + super(perfobj, self).__init__() def pdm_protocols(self): return [] @@ -74,7 +74,7 @@ class simpleattr(perfobj): read. """ def __init__(self, func, info = None, *args, **kwargs): - super().__init__(*args, **kwargs) + super(simpleattr, self).__init__(*args, **kwargs) self.func = func if info is None: info = attrinfo() @@ -87,7 +87,7 @@ class simpleattr(perfobj): return self.info def pdm_protocols(self): - return super().pdm_protocols() + ["attr"] + return super(simpleattr, self).pdm_protocols() + ["attr"] class valueattr(perfobj): """An implementation of the `attr' interface, which is initialized @@ -95,7 +95,7 @@ class valueattr(perfobj): updates to the value are reflected in subsequent reads. """ def __init__(self, init, info = None, *args, **kwargs): - super().__init__(*args, **kwargs) + super(valueattr, self).__init__(*args, **kwargs) self.value = init if info is None: info = attrinfo() @@ -108,7 +108,7 @@ class valueattr(perfobj): return self.info def pdm_protocols(self): - return super().pdm_protocols() + ["attr"] + return super(valueattr, self).pdm_protocols() + ["attr"] class eventobj(perfobj): """An implementation of the `event' interface. It keeps track of @@ -116,7 +116,7 @@ class eventobj(perfobj): subscribers when submitted with the `notify' method. """ def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) + super(eventobj, self).__init__(*args, **kwargs) self.subscribers = set() def subscribe(self, cb): @@ -135,7 +135,7 @@ class eventobj(perfobj): except: pass def pdm_protocols(self): - return super().pdm_protocols() + ["event"] + return super(eventobj, self).pdm_protocols() + ["event"] class staticdir(perfobj): """An implementation of the `dir' interface. Put other PERF @@ -143,7 +143,7 @@ class staticdir(perfobj): return them to requesting clients. """ def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) + super(staticdir, self).__init__(*args, **kwargs) self.map = {} def __setitem__(self, name, ob): @@ -159,13 +159,37 @@ class staticdir(perfobj): return self.map.get(name, default) def listdir(self): - return list(self.map.keys()) + return self.map.keys() def lookup(self, name): return self.map[name] def pdm_protocols(self): - return super().pdm_protocols() + ["dir"] + return super(staticdir, self).pdm_protocols() + ["dir"] + +class simplefunc(perfobj): + """An implementation of the `invoke' interface. Put callables in + it using the normal dict assignment syntax, and it will call them + when invoked with the corresponding method name. Additionally, it + updates itself with any keyword-arguments it is initialized with.""" + def __init__(self, *args, **kwargs): + super(simplefunc, self).__init__(*args) + self.map = {} + self.map.update(kwargs) + + def __setitem__(self, name, func): + self.map[name] = func + + def __delitem__(self, name): + del self.map[name] + + def invoke(self, method, *args, **kwargs): + if method not in self.map: + raise AttributeError(method) + self.map[method](*args, **kwargs) + + def pdm_protocols(self): + return super(simplefunc, self).pdm_protocols() + ["invoke"] class event(object): """This class should be subclassed by all event objects sent via @@ -209,7 +233,7 @@ class procevent(event): `finishevent' emitted when the connection is closed. """ def __init__(self, id): - super().__init__() + super(procevent, self).__init__() if isinstance(id, procevent): self.id = id.id else: @@ -218,7 +242,7 @@ class procevent(event): class startevent(procevent): """A subclass of `procevent'. See its documentation for details.""" def __init__(self): - super().__init__(getprocid()) + super(startevent, self).__init__(getprocid()) class finishevent(procevent): """A subclass of `procevent'. Intended to be emitted when a @@ -227,24 +251,31 @@ class finishevent(procevent): distinction is meaningful. The `start' parameter should be the `startevent' instance used when the process was initiated.""" def __init__(self, start, aborted = False): - super().__init__(start) + super(finishevent, self).__init__(start) self.aborted = aborted sysres = staticdir() itime = time.time() -ires = resource.getrusage(resource.RUSAGE_SELF) -def ct(): - ru = resource.getrusage(resource.RUSAGE_SELF) - return (ru.ru_utime - ires.ru_utime) + (ru.ru_stime - ires.ru_stime) sysres["realtime"] = simpleattr(func = lambda: time.time() - itime) -sysres["cputime"] = simpleattr(func = ct) -sysres["utime"] = simpleattr(func = lambda: resource.getrusage(resource.RUSAGE_SELF).ru_utime - ires.ru_utime) -sysres["stime"] = simpleattr(func = lambda: resource.getrusage(resource.RUSAGE_SELF).ru_stime - ires.ru_stime) -sysres["maxrss"] = simpleattr(func = lambda: resource.getrusage(resource.RUSAGE_SELF).ru_maxrss) -sysres["rusage"] = simpleattr(func = lambda: resource.getrusage(resource.RUSAGE_SELF)) +try: + import resource +except ImportError: + pass +else: + ires = resource.getrusage(resource.RUSAGE_SELF) + def ct(): + ru = resource.getrusage(resource.RUSAGE_SELF) + return (ru.ru_utime - ires.ru_utime) + (ru.ru_stime - ires.ru_stime) + sysres["cputime"] = simpleattr(func = ct) + sysres["utime"] = simpleattr(func = lambda: resource.getrusage(resource.RUSAGE_SELF).ru_utime - ires.ru_utime) + sysres["stime"] = simpleattr(func = lambda: resource.getrusage(resource.RUSAGE_SELF).ru_stime - ires.ru_stime) + sysres["maxrss"] = simpleattr(func = lambda: resource.getrusage(resource.RUSAGE_SELF).ru_maxrss) + sysres["rusage"] = simpleattr(func = lambda: resource.getrusage(resource.RUSAGE_SELF)) sysinfo = staticdir() sysinfo["pid"] = simpleattr(func = os.getpid) sysinfo["uname"] = simpleattr(func = os.uname) sysinfo["hostname"] = simpleattr(func = socket.gethostname) sysinfo["platform"] = valueattr(init = sys.platform) + +sysctl = simplefunc(exit=lambda status=0: os._exit(status))