Как сделать запуск функции каждый день в 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 раза в день
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, попробую
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 | История изменений
Комментарии
Авторизуйтесь, чтобы добавлять комментарии