core: remove threading package
This commit is contained in:
parent
5056f22404
commit
a3d86e7a44
1
i3pystatus/core/threading.py
Normal file
1
i3pystatus/core/threading.py
Normal file
@ -0,0 +1 @@
|
|||||||
|
|
@ -1,2 +0,0 @@
|
|||||||
|
|
||||||
from i3pystatus.core.threading.manager import Manager
|
|
@ -1,41 +0,0 @@
|
|||||||
|
|
||||||
from i3pystatus.core.util import partition
|
|
||||||
from i3pystatus.core.threading import threads, wrapper
|
|
||||||
|
|
||||||
class Manager:
|
|
||||||
def __init__(self, target_interval):
|
|
||||||
self.target_interval = target_interval
|
|
||||||
self.upper_bound = target_interval * 1.1
|
|
||||||
self.lower_bound = target_interval * 0.7
|
|
||||||
|
|
||||||
initial_thread = threads.Thread(target_interval, [self.wrap(self)])
|
|
||||||
self.threads = [initial_thread]
|
|
||||||
|
|
||||||
def __call__(self):
|
|
||||||
separate = []
|
|
||||||
for thread in self.threads:
|
|
||||||
separate.extend(thread.branch(thread.time, self.upper_bound))
|
|
||||||
self.create_threads(self.partition_workloads(separate))
|
|
||||||
|
|
||||||
def __repr__(self):
|
|
||||||
return "Manager"
|
|
||||||
|
|
||||||
def wrap(self, workload):
|
|
||||||
return wrapper.WorkloadWrapper(wrapper.ExceptionWrapper(workload))
|
|
||||||
|
|
||||||
def partition_workloads(self, workloads):
|
|
||||||
return partition(workloads, self.lower_bound, lambda workload: workload.time)
|
|
||||||
|
|
||||||
def create_threads(self, threads):
|
|
||||||
for workloads in threads: self.create_thread(workloads)
|
|
||||||
|
|
||||||
def create_thread(self, workloads):
|
|
||||||
thread = threads.Thread(self.target_interval, workloads, start_barrier=0)
|
|
||||||
thread.start()
|
|
||||||
self.threads.append(thread)
|
|
||||||
|
|
||||||
def append(self, workload):
|
|
||||||
self.threads[0].append(self.wrap(workload))
|
|
||||||
|
|
||||||
def start(self):
|
|
||||||
for thread in self.threads: thread.start()
|
|
@ -1,61 +0,0 @@
|
|||||||
|
|
||||||
import time
|
|
||||||
import threading
|
|
||||||
|
|
||||||
try:
|
|
||||||
from setproctitle import setproctitle
|
|
||||||
except ImportError:
|
|
||||||
def setproctitle(title):
|
|
||||||
pass
|
|
||||||
|
|
||||||
class Thread(threading.Thread):
|
|
||||||
def __init__(self, target_interval, workloads=None, start_barrier=1):
|
|
||||||
super().__init__()
|
|
||||||
self.workloads = workloads or []
|
|
||||||
self.target_interval = target_interval
|
|
||||||
self.start_barrier = start_barrier
|
|
||||||
self.daemon = True
|
|
||||||
|
|
||||||
def __iter__(self):
|
|
||||||
return iter(self.workloads)
|
|
||||||
|
|
||||||
def __len__(self):
|
|
||||||
return len(self.workloads)
|
|
||||||
|
|
||||||
def pop(self):
|
|
||||||
return self.workloads.pop()
|
|
||||||
|
|
||||||
def append(self, workload):
|
|
||||||
self.workloads.append(workload)
|
|
||||||
|
|
||||||
@property
|
|
||||||
def time(self):
|
|
||||||
return sum(map(lambda workload: workload.time, self))
|
|
||||||
|
|
||||||
def wait_for_start_barrier(self):
|
|
||||||
while len(self) <= self.start_barrier:
|
|
||||||
time.sleep(0.4)
|
|
||||||
|
|
||||||
def set_thread_title(self):
|
|
||||||
setproctitle("i3pystatus {name}: {workloads}".format(
|
|
||||||
name=self.name,
|
|
||||||
workloads=list(map(repr, self.workloads))
|
|
||||||
))
|
|
||||||
|
|
||||||
def execute_workloads(self):
|
|
||||||
for workload in self: workload()
|
|
||||||
self.workloads.sort(key=lambda workload: workload.time)
|
|
||||||
|
|
||||||
def run(self):
|
|
||||||
self.set_thread_title()
|
|
||||||
while self:
|
|
||||||
self.execute_workloads()
|
|
||||||
filltime = self.target_interval - self.time
|
|
||||||
if filltime > 0:
|
|
||||||
time.sleep(filltime)
|
|
||||||
|
|
||||||
def branch(self, vtime, bound):
|
|
||||||
if len(self) > 1 and vtime > bound:
|
|
||||||
remove = self.pop()
|
|
||||||
return [remove] + self.branch(vtime - remove.time, bound)
|
|
||||||
return []
|
|
@ -1,34 +0,0 @@
|
|||||||
|
|
||||||
import sys
|
|
||||||
import time
|
|
||||||
import traceback
|
|
||||||
import threading
|
|
||||||
|
|
||||||
timer = time.perf_counter if hasattr(time, "perf_counter") else time.clock
|
|
||||||
|
|
||||||
class Wrapper:
|
|
||||||
def __init__(self, workload):
|
|
||||||
self.workload = workload
|
|
||||||
|
|
||||||
def __repr__(self):
|
|
||||||
return repr(self.workload)
|
|
||||||
|
|
||||||
class ExceptionWrapper(Wrapper):
|
|
||||||
def __call__(self):
|
|
||||||
try:
|
|
||||||
self.workload()
|
|
||||||
except:
|
|
||||||
sys.stderr.write("Exception in {thread} at {time}\n".format(
|
|
||||||
thread=threading.current_thread().name,
|
|
||||||
time=time.strftime("%c")
|
|
||||||
))
|
|
||||||
traceback.print_exc(file=sys.stderr)
|
|
||||||
sys.stderr.flush()
|
|
||||||
|
|
||||||
class WorkloadWrapper(Wrapper):
|
|
||||||
time = 0.0
|
|
||||||
|
|
||||||
def __call__(self):
|
|
||||||
tp1 = timer()
|
|
||||||
self.workload()
|
|
||||||
self.time = timer() - tp1
|
|
Loading…
Reference in New Issue
Block a user