oe/utils: Add simple threaded pool implementation

Python 2.7 doesn't have a threaded pool implementation, just a multiprocessing
one. We have need of a threaded implementation so add some simple class code
to support this.

(From OE-Core rev: 44ae778fefca5112900b870be7a485360c50bc2e)

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Richard Purdie 2015-06-01 22:15:34 +01:00
parent 9fd3c7e64b
commit 5331bbc1ac

View File

@ -207,3 +207,44 @@ def multiprocess_exec(commands, function):
def squashspaces(string):
import re
return re.sub("\s+", " ", string).strip()
#
# Python 2.7 doesn't have threaded pools (just multiprocessing)
# so implement a version here
#
from Queue import Queue
from threading import Thread
class ThreadedWorker(Thread):
"""Thread executing tasks from a given tasks queue"""
def __init__(self, tasks):
Thread.__init__(self)
self.tasks = tasks
self.daemon = True
self.start()
def run(self):
while True:
func, args, kargs = self.tasks.get()
try:
func(*args, **kargs)
except Exception, e:
print e
finally:
self.tasks.task_done()
class ThreadedPool:
"""Pool of threads consuming tasks from a queue"""
def __init__(self, num_threads):
self.tasks = Queue(num_threads)
for _ in range(num_threads): ThreadedWorker(self.tasks)
def add_task(self, func, *args, **kargs):
"""Add a task to the queue"""
self.tasks.put((func, args, kargs))
def wait_completion(self):
"""Wait for completion of all the tasks in the queue"""
self.tasks.join()