Вы можете использовать concurrent.futures.
Создайте три потока и запустите их, используя concurrent.futures.Executor.submit()
Это возвращает вам будущие объекты для каждого потока.
Тогда вы можете
concurrent.futures.wait(fs, timeout=None, return_when=FIRST_COMPLETED)
, который будет блокировать основной поток, пока не завершится один из 3 дочерних потоков.
Тогда вы можете пойти дальше и использовать свой результат.
concurrent.futures.wait Returns a named 2-tuple of sets. The first set, named done and not_done
Вы можете получить свой результат из завершенного объекта фьючерсов, используя метод result (), и вы можете безопасно завершить работу исполнителя, используя Executor.shutdown ()
Вы можете добавлять свои объекты в список и запускать их следующим образом:
futures = []
for task in task_list:
futures.append(executor.submit(task.run))
concurrent.futures.wait(futures,timeout=None,return_when=FIRST_COMPLETED)