python.lang.correctness.concurrent.uncaught-executor-exceptions

Author
7,892
Download Count*
License
Values returned by thread pool map must be read in order to raise exceptions. Consider using for _ in $EXECUTOR.map(...): pass
.
Run Locally
Run in CI
Defintion
rules:
- id: uncaught-executor-exceptions
patterns:
- pattern-inside: |
with concurrent.futures.thread.ThreadPoolExecutor(...) as $EXECUTOR:
...
- pattern-not-inside: |
$VAR = $EXECUTOR.map(...)
...
for ... in $VAR:
...
- pattern-not-inside: |
$VAR = $EXECUTOR.map(...)
...
[... for ... in $VAR]
- pattern-not-inside: |
[... for ... in $EXECUTOR.map(...)]
- pattern-not-inside: |
for $IT in $EXECUTOR.map(...):
...
- pattern: $EXECUTOR.map(...)
message: "Values returned by thread pool map must be read in order to raise
exceptions. Consider using `for _ in $EXECUTOR.map(...): pass`."
severity: WARNING
languages:
- python
metadata:
references:
- https://superfastpython.com/threadpoolexecutor-exception-handling/
category: correctness
technology:
- python
license: Commons Clause License Condition v1.0[LGPL-2.1-only]
Examples
concurrent.py
from concurrent.futures.thread import ThreadPoolExecutor
def foo():
with ThreadPoolExecutor(max_workers=5) as executor:
# ruleid:uncaught-executor-exceptions
executor.map(run_with_app_context, tasks)
with ThreadPoolExecutor(max_workers=5) as executor:
# ok:uncaught-executor-exceptions
for _ in executor.map(run_with_app_context, tasks):
pass
with ThreadPoolExecutor(max_workers=5) as executor:
# ok:uncaught-executor-exceptions
print [x for x in executor.map(run_with_app_context, tasks)]
Short Link: https://sg.run/Av48