42 lines
1.3 KiB
Python
42 lines
1.3 KiB
Python
|
|
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()
|