Процессы можно запускать и убивать тривиально.
Вы можете сделать это.
import subprocess
watch = []
for s in ( "process1.py", "process2.py", "process3.py" ):
sp = subprocess.Popen( s )
watch.append( sp )
Теперь вы просто ждете, пока один из них закончится. Когда один закончит, убейте других.
import time
winner= None
while winner is None:
time.sleep(10)
for w in watch:
if w.poll() is not None:
winner= w
break
for w in watch:
if w.poll() is None: w.kill()
Это процессы, а не потоки. Нет GIL соображений. Составьте расписание операционной системы их; это то, что он делает лучше всего.
Далее, каждый процесс - это просто скрипт, который просто решает проблему, используя один из ваших альтернативных алгоритмов. Они полностью независимы и автономны. Простота проектирования, сборки и тестирования.