Как запускать функцию в python каждый час
Перейти к содержимому

Как запускать функцию в python каждый час

  • автор:

Как сделать запуск функции каждый день в 08:00?

Если добавить команду, то функция через у команду работает. Как сделать чтобы эта функция запускалась, скажем, каждый день в 08:00?

def data_r_new(message): core.log(message.chat, message.text) conn = sqlite3.connect(settings.DATABASE) cursor = conn.cursor() sql = "SELECT * FROM dovidnyk WHERE strftime('%d-%m', data_r) = strftime('%d-%m', 'now')" cursor.execute(sql,) result = cursor.fetchall() for fn in result: sql = "SELECT user_id FROM user WHERE status = True" cursor.execute(sql,) result = cursor.fetchall() for i in result: dr = datetime.strptime(fn[6], '%Y-%m-%d %H:%M:%S').strftime('%d.%m.%Y') msg = "�� ПІБ: <> <> <>\n" \ "�� Дата народження: <>\n".format(fn[3], fn[4], fn[5], dr) sent = bot.send_message(i[0], msg, reply_markup=keyboard, parse_mode='HTML') 

Отслеживать
12.5k 7 7 золотых знаков 18 18 серебряных знаков 48 48 бронзовых знаков
задан 17 янв 2021 в 21:09
Last_Arkhangel Last_Arkhangel
195 3 3 серебряных знака 12 12 бронзовых знаков

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

Первый вариант: Работает нормально с polling, но с flask не работает.

from multiprocessing import * import schedule def start_process(): p1 = Process(target=P_schedule.start_schedule, args=()).start() def start_schedule(): schedule.every().day.at("08:00").do(data_r_new) while True: schedule.run_pending() time.sleep(1) def data_r_new(): . if __name__ == '__main__': start_process() bot.polling(none_stop=True) 

Второй вариант: Работает нормально с flask.

from flask_apscheduler import APScheduler def data_r_new(): . scheduler = APScheduler() if __name__ == '__main__': if not app.debug or os.environ.get('WERKZEUG_RUN_MAIN') == 'true': scheduler.add_job(id ='data_r_mess_new', func = data_r_mess_new, trigger = 'cron', hour = 8, minute = 0, second = 0) scheduler.start() 

ПС. Строка if not app.debug or os. нужна для того чтобы не приходило сообщение два раза, когда во flask включен debug=True . Если debug не включен, эту строчку можно убрать.

Отслеживать
ответ дан 7 фев 2021 в 0:59
Last_Arkhangel Last_Arkhangel
195 3 3 серебряных знака 12 12 бронзовых знаков

Вы можете запускать свои скрипты в определенное время через python-rq. Эта библиотека довольно просто подключается:

from redis import Redis from rq import Queue q = Queue(connection=Redis()) 
q.enqueue_at(datetime(2021, 01, 20, 8, 0), data_r_new, message) 

А с помощью функции enqueue_in можно задать интервал, через который функция будет выполняться

Библиотека имеет хорошую документацию, и не требует глубокого изучения. Является в какой-то степени альтернативой для известной celery.

Запускается так же отдельным процессом (для запуска с планировщиком необходимо задать дополнительный ключ):

rq worker --with-scheduler 

P.S: В качестве альтернативы так же можете посмотреть в сторону dramatiq (поддерживает приоритеты задач и их запуск через заданный промежуток времени)

Отслеживать
ответ дан 17 янв 2021 в 23:03
1,978 15 15 серебряных знаков 25 25 бронзовых знаков

Как возможная альтернатива.

Первое. Вероятно, надо установить специальный модуль schedule. Он не входит в перечень стандартных модулей «из коробки».

$ pip install schedule 

Второе. Добавить в программу следующее:

import schedule import time def job(): print("I'm working. ") schedule.every().day.at("08:00").do(job) while True: schedule.run_pending() time.sleep(1) 

Здесь — job — это ваша функцию, которую вы хотите выполнять в 8:00.

Есть еще модуль shed из стандартной библиотеки, но там время идет в секундах от начала эпохи и придется повозиться, с тем чтобы добавлять задачу на 8:00. Однако это может оказаться полезным упражнением и ничего дополнительно не надо устанавливать.

=== Альтернатива альтернативе ===
Используем модуль строенный модуль тайм time и смекалку :-).

import time time.localtime() Out[42]: time.struct_time(tm_year=2021, tm_mon=1, tm_mday=18, tm_hour=13, tm_min=7, tm_sec=22, tm_wday=0, tm_yday=18, tm_isdst=0) time.localtime().tm_hour Out[43]: 13 

Как видите, несложно узнать текущее время, используя

.tm_hour .tm_min .tm_sec 
import time . while True: time.sleep(1) z = time.localtime() if z.tm_hour == 8 and z.tm_min == 0 and tm_sec == 0: print("Бимба") 

Как выполнять функции циклично каждые 30 минут, час и т.д?

Имеется множество разных функций которые парсят данные, каждая из них должна срабатывать каждые 30 минут, час и тд. Как можно реализовать?

  • Вопрос задан более трёх лет назад
  • 10075 просмотров

Комментировать
Решения вопроса 1
Сергей Горностаев @sergey-gornostaev Куратор тега Python
Седой и строгий
Раз вариант:

import sched, time s = sched.scheduler(time.time, time.sleep) def f(): s.enter(5, 1, f) # Перезапуск через 5 секунд print(time.time()) f() s.run()

Два вариант:

import threading def f(): threading.Timer(5.0, f).start() # Перезапуск через 5 секунд print("Hello!") f()

Совсем тупой вариант:

import time def f(): print("Hello!") while True: time.sleep(5) f()

Ответ написан более трёх лет назад
Нравится 2 1 комментарий
markinmarch @markinmarch

«совсем тупой» вариант самый простой и практичный. Зачем перегружать код импортируемыми библиотеками, если нет в этом сильной надобности?

Ответы на вопрос 2
jistulamle @jistulamle
В linux есть планировщик заданий — cron.
Ответ написан более трёх лет назад
hpmalo @hpmalo Автор вопроса
а секундомер можно сделать?
Сергей Горностаев @sergey-gornostaev Куратор тега Python
hpmalo, так вам секундомер или парсить?
jistulamle @jistulamle

hpmalo, а кто вам помешает его сделать, кому что удобно, к тому же все зависит от задачи. Если у вас 5 функция то каждую запускать в кроне не целесообразно.

Запуск функции в определенное время

Подскажите пожалуйсту, мне нужно вызывать функцию ежедневно в 12 и 18 часов, можно это как то сделать без таймера?

Если это делать таймером, то какой агоритм? думал сделать time.sleep на час, а потом проверять если время больше 12 и меньше 13, вызывать функцию, но так может сработать и в 12.50, а мне надо максимально близко к 12

94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Запуск messagebox в определенное время
Здрям! Как к форме на tkinter прикрутить появление messagebox в определенное время? Т.е.

Запуск некой функции в определенное время
Необходимо чтобы ежедневно в заданное время запускалась определенная функция. Подскажите как это.

Запуск функции через определенное время
помогите, пожалуйста, сделать запуск функции через определенное время. const text = "Hello world";.

Запуск файла в определенное время
procedure TForm1.Timer1Timer(Sender: TObject); var T:TDateTime; begin T:=time; .

814 / 526 / 214
Регистрация: 22.12.2017
Сообщений: 1,495
Jhonat, если работаете в windows, можно использовать планировщик заданий
Регистрация: 03.11.2019
Сообщений: 69

codcw, ubuntu server. Код выполняется постоянно, если таймер по минуте делать, наверно не очень хорошо для всего двух срабатываний в сутки?

Регистрация: 22.07.2017
Сообщений: 18
Чем Вам cron не мил?
почитайте тут
Регистрация: 03.11.2019
Сообщений: 69

Pavel5817, мне надо не отдельный файл скрипта запускать, а в работающем вызывать функцию 2 раза в день

Эксперт Python

5415 / 3839 / 1214
Регистрация: 28.10.2013
Сообщений: 9,554
Записей в блоге: 1

ЦитатаСообщение от Jhonat Посмотреть сообщение

а в работающем вызывать функцию 2 раза в день

Упал.
То есть ты хотел в работающем на сервере коде поставить time.sleep?
Ты не в курсе, что он полностью заблокирует всю твою программу?

814 / 526 / 214
Регистрация: 22.12.2017
Сообщений: 1,495
Jhonat, может, эта библиотека подойдет?
https://docs.python.org/3/library/sched.html
Регистрация: 03.11.2019
Сообщений: 69
Garry Galler,я бы это делал в отдельном потоке, ну либо не sleep а по таймеру
codcw, попробую

Эксперт Python

5415 / 3839 / 1214
Регистрация: 28.10.2013
Сообщений: 9,554
Записей в блоге: 1

Один из десятков примеров на стековерфлоу самоперезапускающихся таймеров (слегка модифицировал его под задачу на время):

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
import time from threading import Timer from datetime import datetime # функция для запуска в нужное время def hello(): print("hello, world") class RepeatedTimer(object): nruns = 0 def __init__(self, times, function, *args, **kwargs): self._timer = None self.function = function self.times = times self.args = args self.kwargs = kwargs self.is_running = False self.start() def _run(self): self.is_running = False self.start() self.function(*self.args, tm=type(self), **self.kwargs) def start(self): if self.times[1] !=-1 and type(self).nruns >= self.times[1]: self.stop() # больше ничего не перезапускаем return if not self.is_running: # если число запусков не бесконечно (-1) и оно превысило переданное значение self._timer = Timer(self.times[0], self._run) self._timer.start() self.is_running = True def stop(self): self._timer.cancel() self.is_running = False def timer(start, **kwargs): # получаем текущее время для сравнения now = datetime.today().strftime("%H:%M:%S") tm = kwargs.get('tm') # объект нашего класса таймера (не экземпляр!) print(now, tm.nruns) # просто дебаг # првоеряем не подошло ли время. if str(now) == start: hello() # функция, которая должна быть запущена в опред. время tm.nruns += 1 # считаем число запусков def main(): time.sleep(100) print('end main') if __name__ == "__main__": # запускаем проверку каждую секунду, запуск функции - ровно 1 раз (-1 бесконечно) rt = RepeatedTimer((1.,1), timer, '23:45:00') try: main() # your long-running job goes here. finally: rt.stop()

87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

Запуск запроса в определенное время
Требуется проверить текущее время, и если оно соответствует определеному 00:01 (без секунд).

Запуск скрипта в определенное время
Нужно каждый час из global.asax запускать скрипт. Как такое можно реализовать?

Запуск метода в определенное время
Ребят как запускать метод в определённое время каждый день ? Это должно работать в private void.

Запуск скрипта в определенное время
Подскажите по сабжу плиз. например как сделано при отправке открыток, те отправить через день.

Запуск скрипта в определенное время
Подскажите по сабжу плиз. например как сделано при отправке открыток, те отправить через день.

Запуск скрипта в определенное время.
Можно ли сделать так, чтобы мой скрипт запускался в определенное время. Т.е. мне нужно, чтобы.

Запуск макроса в определенное время
Необходимо, чтобы определенный макрос запускался каждый день в 20:00. Как это сделать?

Выполнять код через указанный промежуток времени

Выполнить код через указанный промежуток времени можно через объект Timer() .

from threading import Timer def hello(): print("Привет, мир") # выполнить функцию hello() через 10 секунд t = Timer(10, hello) t.start()

При этом дальнейший код продолжится выполняться, и через указанный промежуток времени выполнится нужная функция.

Если надо отменить выполнение кода, то используется метод cancel() .

# Отменить выполнение функции, которая должна выполниться через 10 секунд t.cancel()

Выполнять функцию каждые 10 секунд

Выполнить код через каждый промежуток времени, можно повторно вызывая объект Timer() .

from threading import Timer # выполнять функцию hello() каждые 10 секунд def hello(): print("Привет, мир") Timer(10, hello).start() hello()

Обновлено: 01 ноября 2020 | История изменений

Комментарии

Авторизуйтесь, чтобы добавлять комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *