From 955cddf3d8ad63e8ea3c0dedeb6ade7144b19b2e Mon Sep 17 00:00:00 2001 From: padu Date: Fri, 29 Jul 2022 20:31:10 +0300 Subject: [PATCH] Added error_behaviour and set_error_value parameters to the progress_map, progress_imap and progress_input methods. --- README.md | 98 ++++++++++++++++++++++++++++++++++++- gifs/error_bar_1.gif | Bin 14544 -> 11668 bytes gifs/error_bar_2.gif | Bin 14899 -> 12048 bytes parallelbar/parallelbar.py | 61 ++++++++++++++--------- parallelbar/tools.py | 4 +- setup.py | 2 +- 6 files changed, 139 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index b4a49dd..d3820f9 100644 --- a/README.md +++ b/README.md @@ -153,11 +153,107 @@ time took 1.010124 s. As you can see, instead of 5 seconds of execution, the function was interrupted after 1 second of timeout. If `raise_exception=True`, a **TimeoutError** exception will be raised. +## New in version 0.3.0 +1. The `error_behavior` keyword argument has been added to the **progress_map**, **progress_imap** and **progress_imapu** methods. +Must be one of the values: "raise", "ignore", "coerce". + - "raise" - raise an exception thrown in the process pool. + - "ignore" - ignore the exceptions that occur. Do not add anything to the result + - "coerce" - handle the exception. The result will include the value set by the parameter `set_error_value` (by default None - the traceback of the raised exception will be added to the result) +2. The `set_error_value` keyword argument has been added to the **progress_map**, **progress_imap** and **progress_imapu** methods. + +Example of usage + +```python +import time +import resource as rs +from parallelbar import progress_imap + + +def memory_limit(limit): + soft, hard = rs.getrlimit(rs.RLIMIT_AS) + rs.setrlimit(rs.RLIMIT_AS, (limit, hard)) + + +def my_awesome_foo(n): + if n == 0: + s = 'a' * 10000000 + elif n == 20: + time.sleep(100) + else: + time.sleep(1) + return n + + +if __name__ == '__main__': + tasks = range(30) + start = time.monotonic() + result = progress_imap(my_awesome_foo, tasks, + process_timeout=1.5, + initializer=memory_limit, + initargs=(100,), + n_cpu=4, + error_behavior='coerce', + set_error_value=None, + ) + print(f'time took: {time.monotonic() - start:.1f}') + print(result) +``` +![](https://raw.githubusercontent.com/dubovikmaster/parallelbar/main/gifs/test-new.gif) +``` +time took: 8.2 +[MemoryError(), 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, +16, 17, 18, 19, TimeoutError('function "my_awesome_foo" took longer than 1.5 s.'), 21, 22, 23, 24, 25, 26, 27, 28, 29] +``` +Set NaN instead of tracebacks to the result of the pool operation: +```python +if __name__ == '__main__': + tasks = range(30) + start = time.monotonic() + result = progress_imap(my_awesome_foo, tasks, + process_timeout=1.5, + initializer=memory_limit, + initargs=(100,), + n_cpu=4, + error_behavior='coerce', + set_error_value=float('nan'), + ) + print(f'time took: {time.monotonic() - start:.1f}') + print(result) +``` +![](https://raw.githubusercontent.com/dubovikmaster/parallelbar/main/gifs/test-new.gif) +``` +time took: 8.0 +[nan, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, +16, 17, 18, 19, nan, 21, 22, 23, 24, 25, 26, 27, 28, 29] +``` +Let's ignore exception: +```python +if __name__ == '__main__': + tasks = range(30) + start = time.monotonic() + result = progress_imap(my_awesome_foo, tasks, + process_timeout=1.5, + initializer=memory_limit, + initargs=(100,), + n_cpu=4, + error_behavior='ignore', + set_error_value=None, + ) + print(f'time took: {time.monotonic() - start:.1f}') + print(result) +``` +![](https://raw.githubusercontent.com/dubovikmaster/parallelbar/main/gifs/test-new.gif) +``` +time took: 8.0 +[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, +16, 17, 18, 19, 21, 22, 23, 24, 25, 26, 27, 28, 29] +``` + + ## Problems of the naive approach Why can't I do something simpler? Let's take the standard **imap** method and run through it in a loop with **tqdm** and take the results from the processes: - ```python from multiprocessing import Pool from tqdm.auto import tqdm diff --git a/gifs/error_bar_1.gif b/gifs/error_bar_1.gif index 4c6fce7f134f730f9c63982c69d36d8407f0c2ae..a4421f0c1a6a4a85a159824ea5a4b8783a120246 100644 GIT binary patch delta 9023 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 n^8+lVSz4xE6yOU7c6+QO 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⁣Cnfx9<`uMFdlE!@NOY%> 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