В поисках ответа на свой вопрос (решение доступно в одном ответе в связанном дубликате) я обнаружил concurrent.futures
, и, в частности, concurrent.futures.as_completed
.
Код, который у меня получился (для контекста: мне нужно было отлавливать в основной программе исключения, возникающие в потоках, запущенных из этой основной программы) работает нормально, за исключением того, что я не знаю, как перепривязать к имени функции изучается в concurrent.futures.as_completed
:
import concurrent.futures
class Checks:
@staticmethod
def isok():
print("OK")
@staticmethod
def isko():
raise Exception("KO")
# db will keep a map of method names in Check with the thread handler
db = {}
with concurrent.futures.ThreadPoolExecutor(max_workers=1) as executor:
# get the names of the methods in Check, discarding the built-ion ones
for check in [k for k in dir(Checks) if not k.startswith('_')]:
db[check] = executor.submit(getattr(Checks, check))
# at that point I have a map of function_name_as_a_string -> thread handler
for future in concurrent.futures.as_completed([db[k] for k in db.keys()]):
if future.exception():
print(f"{str(future.exception())} was raised (I do not know where, somewhere)")
else:
print("success (again, I do not know where, exactly)")
# all the threads are finished at that point
print("all threads are done")
В выводах успеха/неудачи я знаю, что метод вызвал исключение или нет. Чего я не знаю, так это того, кто что сделал.
Поскольку итерация должна проходить через обработчики потоков, я не смог найти способ "внедрить" имя метода в цикл, чтобы использовать его в print()
. Как мне это сделать?