diff options
Diffstat (limited to 'lib/bb/cooker.py')
-rw-r--r-- | lib/bb/cooker.py | 29 |
1 files changed, 11 insertions, 18 deletions
diff --git a/lib/bb/cooker.py b/lib/bb/cooker.py index 492cf6e3a..bb09dff82 100644 --- a/lib/bb/cooker.py +++ b/lib/bb/cooker.py @@ -32,7 +32,6 @@ import sre_constants import threading from cStringIO import StringIO from contextlib import closing -from concurrent import futures from functools import wraps from collections import defaultdict import bb, bb.exceptions, bb.command @@ -1453,16 +1452,20 @@ class CookerParser(object): self.start() def start(self): + def init(cfg): + parse_file.cfg = cfg + multiprocessing.util.Finalize(None, bb.codeparser.parser_cache_save, args=(self.cooker.configuration.data, ), exitpriority=1) + self.results = self.load_cached() if self.toparse: bb.event.fire(bb.event.ParseStarted(self.toparse), self.cfgdata) - parse_file.cfg = self.cfgdata - multiprocessing.util.Finalize(None, bb.codeparser.parser_cache_save, args=(self.cfgdata,), exitpriority=1) - self.executor = futures.ProcessPoolExecutor(max_workers=self.num_processes) - self.futures = dict((self.executor.submit(parse_file, task), task) for task in self.willparse) - self.results = itertools.chain(self.results, self.parse_gen()) + self.pool = multiprocessing.Pool(self.num_processes, init, [self.cfgdata]) + parsed = self.pool.imap(parse_file, self.willparse) + self.pool.close() + + self.results = itertools.chain(self.results, parsed) def shutdown(self, clean=True): if not self.toparse: @@ -1475,9 +1478,8 @@ class CookerParser(object): self.total) bb.event.fire(event, self.cfgdata) else: - for future in self.futures: - future.cancel() - self.executor.shutdown() + self.pool.terminate() + self.pool.join() sync = threading.Thread(target=self.bb_cache.sync) sync.start() @@ -1489,15 +1491,6 @@ class CookerParser(object): cached, infos = self.bb_cache.load(filename, appends, self.cfgdata) yield not cached, infos - def parse_gen(self): - for future in futures.as_completed(self.futures): - task = self.futures[future] - exc = future.exception() - if exc: - raise exc - else: - yield future.result() - def parse_next(self): try: parsed, result = self.results.next() |