Как уже упоминалось выше, к сожалению, API executor.map ограничен и позволяет получить только первое исключение. Кроме того, при переборе результатов вы получите значения только с первым исключением.
Чтобы ответить на ваш вопрос, если вы не хотите использовать другую библиотеку, вы можете развернуть карту и вручную применить каждую функцию:
future_list = []
with concurrent.futures.ThreadPoolExecutor() as executor:
for arg in range(10):
future = executor.submit(test_func, arg)
future_list.append(future)
for future in future_list:
try:
print(future.result())
except Exception as e:
print(e)
Это позволяет вам обрабатывать каждое будущее индивидуально.