diff options
Diffstat (limited to 'clang-r353983/share/opt-viewer/optpmap.py')
| -rwxr-xr-x | clang-r353983/share/opt-viewer/optpmap.py | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/clang-r353983/share/opt-viewer/optpmap.py b/clang-r353983/share/opt-viewer/optpmap.py new file mode 100755 index 00000000..8124c8c9 --- /dev/null +++ b/clang-r353983/share/opt-viewer/optpmap.py @@ -0,0 +1,56 @@ +import sys +import multiprocessing + + +_current = None +_total = None + + +def _init(current, total): + global _current + global _total + _current = current + _total = total + + +def _wrapped_func(func_and_args): + func, argument, should_print_progress, filter_ = func_and_args + + if should_print_progress: + with _current.get_lock(): + _current.value += 1 + sys.stdout.write('\r\t{} of {}'.format(_current.value, _total.value)) + sys.stdout.flush() + + return func(argument, filter_) + + +def pmap(func, iterable, processes, should_print_progress, filter_=None, *args, **kwargs): + """ + A parallel map function that reports on its progress. + + Applies `func` to every item of `iterable` and return a list of the + results. If `processes` is greater than one, a process pool is used to run + the functions in parallel. `should_print_progress` is a boolean value that + indicates whether a string 'N of M' should be printed to indicate how many + of the functions have finished being run. + """ + global _current + global _total + _current = multiprocessing.Value('i', 0) + _total = multiprocessing.Value('i', len(iterable)) + + func_and_args = [(func, arg, should_print_progress, filter_) for arg in iterable] + if processes == 1: + result = list(map(_wrapped_func, func_and_args, *args, **kwargs)) + else: + pool = multiprocessing.Pool(initializer=_init, + initargs=(_current, _total,), + processes=processes) + result = pool.map(_wrapped_func, func_and_args, *args, **kwargs) + pool.close() + pool.join() + + if should_print_progress: + sys.stdout.write('\r') + return result |
