i3pystatus/i3pystatus/core/threading/manager.py

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()