Ответ зависит от целого ряда факторов.
1. Должна ли программа делать что-то ещё? Если да, то что именно?
2. Сколько таких периодических методов будет существовать? Строго один, или может быть более? Должны ли у них быть разные периоды?
Если программа синхронная, и метод только один, то можно использовать простой приём:
import time
stop = False
def proc_to_call():
global stop
#Это твой периодический вызов
#когда нужен останов, делаешь stop = True
pass
while not stop:
time.sleep(60)
proc_to_call()
#код после цикла выполнится только после прерывания цикла.
Если вызовов несколько и с разной периодичностью, то лучше использовать пакет
schedule. Но у тебя всё равно будет бесконечный цикл вида
while True:
schedule.run_pending()
time.sleep(1)
И пока программа крутится в этом цикле, она не будет делать ничего другого.
Если тебе нужно делать что-то параллельно с периодическим вызовом, то дело усложняется.
Если твоя программа синхронная, то тебе потребуется
отдельный поток выполнения.
import threading
class MyJob(threading.Thread):
def __init__(self):
super().__init__(self)
self.stop = threading.Event()
def proc_to_call(self):
#Это твой периодический вызов
pass
def run(self):
while not self.stop.wait(60):
self.proc_to_call()
job = MyJob()
job.start()
#код основного потока продолжает выполняться после этого
#когда нужен останов, делаешь
job.stop.set() #сигналим об останове
job.join() #ждём завершения потока
Почему использую Event вместо простой логической переменной и time.sleep()? Потому что в случае с time.sleep() тебе придётся ждать конца минуты, прежде чем поток снова проверит логический флаг и поймёт, что пора останавливаться. А при использовании Event его установка тут же прервёт ожидание - и выйдет из цикла.
А если твоя программа асинхронная, то всё упрощается, так как корутины уже могут чередовать своё выполнение, выполняясь "как бы параллельно". Можно использовать как schedule, так и простой цикл, просто не забывай использовать await asyncio.sleep() вместо time.sleep().