Как запускать метод каждую минуту?

Доброго времени суток. Подскажите, как мне запускать метод (функцию )в моей программе каждую минуту ?
  • Вопрос задан
  • 77 просмотров
Решения вопроса 1
@Vindicar
Ответ зависит от целого ряда факторов.
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().
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы