diff --git a/Interlace/lib/threader.py b/Interlace/lib/threader.py index 2d64611..cf5e9da 100644 --- a/Interlace/lib/threader.py +++ b/Interlace/lib/threader.py @@ -3,12 +3,20 @@ class Worker(object): - def __init__(self, pool): - self.pool = pool + def __init__(self, queue, timeout, output): + self.queue = queue + self.timeout = timeout + self.output = output - def __call__(self, task, output, timeout): - self.run_task(task) - self.pool.workers.append(self) + def __call__(self): + while True: + try: + # get task from queue + task = self.queue.pop(0) + # run task + self.run_task(task) + except IndexError: + break @staticmethod def run_task(task): @@ -17,28 +25,47 @@ def run_task(task): class Pool(object): def __init__(self, max_workers, queue, timeout, output): + + # check if there are enough workers + if max_workers <= 0: + raise ValueError("Workers must be >= 1") + + # check if the queue is empty + if not queue: + raise ValueError("The queue is empty") + self.queue = queue - self.workers = [Worker(self) for w in range(max_workers)] self.timeout = timeout self.output = output + self.max_workers = max_workers def run(self): - while True: - # make sure resources are available - if not self.workers: - continue + workers = [Worker(self.queue, self.timeout, self.output) for w in range(self.max_workers)] + threads = [] - # check if the queue is empty - if not self.queue: - break - # get a worker - worker = self.workers.pop(0) + # run + for worker in workers: + thread = threading.Thread(target=worker) + thread.start() + threads.append(thread) - # get task from queue - task = self.queue.pop(0) + # wait until all workers have completed their tasks + for thread in threads: + thread.join() - # run - thread = threading.Thread(target=worker, args=(task, self.output, self.timeout)) - thread.start() \ No newline at end of file +if __name__ == "__main__": + tasks = ["sleep 1", + "sleep 2", + "sleep 3", + "sleep 4", + "sleep 5", + "sleep 6", + "sleep 7", + "sleep 8", + "sleep 9", + "sleep 1", + "echo 'Char!'"] + p = Pool(4, tasks, 0, 0) + p.run()