import threading
def background_job():
while True:
my_function_1() # фоновые функции
my_function_2()
....
time.sleep(interval) # засыпаем на интервал в секундах
interval = 1800 # интервал в секундах
thread = threading.Thread(target=background_job, args=())
thread.daemon = False #True
thread.start()
все работает, для моего конкретного случая то, что надо.
Обнаружил одну особенность.. фоновые процессы останавливаются если в их коде есть print('чегонибудь').
Убрал вывод служебной инфы и все заработало.
Вопрос в посте #7 остается актуальным.