mirror of
https://github.com/codingo/Interlace.git
synced 2026-01-24 17:34:46 +01:00
Merge pull request #1 from codingo/threader
modified threader to be more cpu efficient
This commit is contained in:
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user