Skip to content

Commit ba2156a

Browse files
authored
Merge pull request #1 from codingo/threader
modified threader to be more cpu efficient
2 parents 071c664 + 4ab475d commit ba2156a

File tree

1 file changed

+47
-20
lines changed

1 file changed

+47
-20
lines changed

Interlace/lib/threader.py

Lines changed: 47 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,20 @@
33

44

55
class Worker(object):
6-
def __init__(self, pool):
7-
self.pool = pool
6+
def __init__(self, queue, timeout, output):
7+
self.queue = queue
8+
self.timeout = timeout
9+
self.output = output
810

9-
def __call__(self, task, output, timeout):
10-
self.run_task(task)
11-
self.pool.workers.append(self)
11+
def __call__(self):
12+
while True:
13+
try:
14+
# get task from queue
15+
task = self.queue.pop(0)
16+
# run task
17+
self.run_task(task)
18+
except IndexError:
19+
break
1220

1321
@staticmethod
1422
def run_task(task):
@@ -17,28 +25,47 @@ def run_task(task):
1725

1826
class Pool(object):
1927
def __init__(self, max_workers, queue, timeout, output):
28+
29+
# check if there are enough workers
30+
if max_workers <= 0:
31+
raise ValueError("Workers must be >= 1")
32+
33+
# check if the queue is empty
34+
if not queue:
35+
raise ValueError("The queue is empty")
36+
2037
self.queue = queue
21-
self.workers = [Worker(self) for w in range(max_workers)]
2238
self.timeout = timeout
2339
self.output = output
40+
self.max_workers = max_workers
2441

2542
def run(self):
26-
while True:
2743

28-
# make sure resources are available
29-
if not self.workers:
30-
continue
44+
workers = [Worker(self.queue, self.timeout, self.output) for w in range(self.max_workers)]
45+
threads = []
3146

32-
# check if the queue is empty
33-
if not self.queue:
34-
break
3547

36-
# get a worker
37-
worker = self.workers.pop(0)
48+
# run
49+
for worker in workers:
50+
thread = threading.Thread(target=worker)
51+
thread.start()
52+
threads.append(thread)
3853

39-
# get task from queue
40-
task = self.queue.pop(0)
54+
# wait until all workers have completed their tasks
55+
for thread in threads:
56+
thread.join()
4157

42-
# run
43-
thread = threading.Thread(target=worker, args=(task, self.output, self.timeout))
44-
thread.start()
58+
if __name__ == "__main__":
59+
tasks = ["sleep 1",
60+
"sleep 2",
61+
"sleep 3",
62+
"sleep 4",
63+
"sleep 5",
64+
"sleep 6",
65+
"sleep 7",
66+
"sleep 8",
67+
"sleep 9",
68+
"sleep 1",
69+
"echo 'Char!'"]
70+
p = Pool(4, tasks, 0, 0)
71+
p.run()

0 commit comments

Comments
 (0)