Как сделать запуск функции каждый день в 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 золотых знаков 19 19 серебряных знаков 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 минут, час и тд. Как можно реализовать?
- Вопрос задан более трёх лет назад
- 10872 просмотра
Комментировать
Решения вопроса 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 функция то каждую запускать в кроне не целесообразно.
Как выполнять функцию python каждый день в определенное время?
Пишу бота который должен каждое утро рассылать сообщения пользователям, функция для этого уже написана. Как мне запускать эту функцию каждый день? «schedule» использовать не могу, т.к. его цикл блокирует другие функции бота.
- Вопрос задан более трёх лет назад
- 8068 просмотров
3 комментария
Простой 3 комментария
blablatdinov @blablatdinov Автор вопроса
saund901, я так понимаю, если мне надо будет выполнять функцию в 7:00, то и скрипт мне надо запускать в определенное время каждый раз? Тогда если бот упадет мне надо будет ждать этого времени?

blablatdinov, запихнуть schedule в отдельный поток/процесс?
Решения вопроса 1

Запустите schedule в отдельном потоке (thread), процессе (multiprocessing) или асинхронно (asincio).
Или реализовать отправку при передаче особого параметра при запуске бота и запускать по крону. Типа
python mybot.py —motd
Ответ написан более трёх лет назад
Комментировать
Нравится 3 Комментировать
Ответы на вопрос 2

Используя стандартный модуль threading.
Пример
from time import sleep, time from functools import wraps def mult_threading(func): """Декоратор для запуска функции в отдельном потоке""" @wraps(func) def wrapper(*args_, **kwargs_): import threading func_thread = threading.Thread(target=func, args=tuple(args_), kwargs=kwargs_) func_thread.start() return func_thread return wrapper # Сразу делаем функцию многопоточной @mult_threading def some_func(x, y, name="Petia", df=None, *args, **kwargs): sleep(5) # Тут мы чего-то доолго ждем / вычисляем / etc print("X = %s; Y = %s; Name=%s; df=%s" % (x, y, name, df)) print("Another args:", args, kwargs) # ==Проверяем работу== # Стартуем нашу долгоиграющую функцию some_func(4, 7, df=11, 21, clone="SomeClone") # Занимаемся очень важными делами for Z in range(25): print(Z) sleep(0.2)
Выполнять код через указанный промежуток времени
Выполнить код через указанный промежуток времени можно через объект 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
Комментарии
Авторизуйтесь, чтобы добавлять комментарии