Merge pull request #1 from codingo/threader

modified threader to be more cpu efficient
This commit is contained in:
Michael Skelton
2018-10-26 11:31:34 +10:00
committed by GitHub

View File

@@ -3,12 +3,20 @@ import os
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 @@ class Worker(object):
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()
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()