diff options
| author | Richard Purdie <richard.purdie@linuxfoundation.org> | 2015-06-01 22:15:34 +0100 |
|---|---|---|
| committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2015-06-03 16:38:45 +0100 |
| commit | 5331bbc1ac797e7503dd7fcf9780b0eab7274fc7 (patch) | |
| tree | 937371ab103d3003b6d3cdc1957b71287fea0c4f | |
| parent | 9fd3c7e64b55bc2d984aa7fdac2f0e2ed58b9033 (diff) | |
| download | poky-5331bbc1ac797e7503dd7fcf9780b0eab7274fc7.tar.gz | |
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>
| -rw-r--r-- | meta/lib/oe/utils.py | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/meta/lib/oe/utils.py b/meta/lib/oe/utils.py index 7173e106f5..0de880013a 100644 --- a/meta/lib/oe/utils.py +++ b/meta/lib/oe/utils.py | |||
| @@ -207,3 +207,44 @@ def multiprocess_exec(commands, function): | |||
| 207 | def squashspaces(string): | 207 | def squashspaces(string): |
| 208 | import re | 208 | import re |
| 209 | return re.sub("\s+", " ", string).strip() | 209 | return re.sub("\s+", " ", string).strip() |
| 210 | |||
| 211 | # | ||
| 212 | # Python 2.7 doesn't have threaded pools (just multiprocessing) | ||
| 213 | # so implement a version here | ||
| 214 | # | ||
| 215 | |||
| 216 | from Queue import Queue | ||
| 217 | from threading import Thread | ||
| 218 | |||
| 219 | class ThreadedWorker(Thread): | ||
| 220 | """Thread executing tasks from a given tasks queue""" | ||
| 221 | def __init__(self, tasks): | ||
| 222 | Thread.__init__(self) | ||
| 223 | self.tasks = tasks | ||
| 224 | self.daemon = True | ||
| 225 | self.start() | ||
| 226 | |||
| 227 | def run(self): | ||
| 228 | while True: | ||
| 229 | func, args, kargs = self.tasks.get() | ||
| 230 | try: | ||
| 231 | func(*args, **kargs) | ||
| 232 | except Exception, e: | ||
| 233 | print e | ||
| 234 | finally: | ||
| 235 | self.tasks.task_done() | ||
| 236 | |||
| 237 | class ThreadedPool: | ||
| 238 | """Pool of threads consuming tasks from a queue""" | ||
| 239 | def __init__(self, num_threads): | ||
| 240 | self.tasks = Queue(num_threads) | ||
| 241 | for _ in range(num_threads): ThreadedWorker(self.tasks) | ||
| 242 | |||
| 243 | def add_task(self, func, *args, **kargs): | ||
| 244 | """Add a task to the queue""" | ||
| 245 | self.tasks.put((func, args, kargs)) | ||
| 246 | |||
| 247 | def wait_completion(self): | ||
| 248 | """Wait for completion of all the tasks in the queue""" | ||
| 249 | self.tasks.join() | ||
| 250 | |||
