Найти - Пользователи
Полная версия: Выполнение по расписанию
Начало » Python для новичков » Выполнение по расписанию
1
Harismatik
Всем привет, создаю Discord бота на великом Python. Столкнулся с острой необходимостью выполнения части кода / отдельной функции, каждые 15 минут и другой части каждый день в полночь. Простейший метод через while True - sleep не работает, так как он просто парализует работу всего бота. Встречал иногда на просторах интернета библиотеку Scheduler, но так и не понял что к чему и как нею пользоваться. Возможно, среди вас найдётся ВЕЛИКИЙ человек, с неизмеримым багажом знаний, что поможет реализовать мою задумку.
py.user.next
Конкретнее задачу опиши.

Harismatik
создаю Discord бота
Что он делает?
Harismatik
Это не так важно…. Пользователи с помощью команды устанавливают себе настройки (роли, ники и тд..). Все эти данные записываются в .json. Бот должен каждую полночь открывать этот файл и проверять каждого пользователя является ли он ещё участником сервера, если нет - удаляет его данные. Весь функционал я уже реализовал, но эту функцию “проверки” приходится запускать вручную. Читал так-же про Cron, но так и не нашёл понятного гайда… Использования sleep вообще никак не катит, так как тормозит всего бота.
passant
О параллельных процессах слыхали?
1. Создаете отдельный процесс. Как - зависит от логики вашего приложения, который вы таинственно скрываете. Может- как совершенно отдельный процесс. Может ваш бот сам порождает этот процесс. Может еще каким образом.
2. Теперь ваш порожденный процесс (если он создан правильно) живет отдельной жизнью и никак не влияет на породивший его процесс. Соответственно, sleep в порожденном процессе никак не влияет (не тормозит) породивший его процесс.
3. Просыпаться этот процесс может по известному вам алгоритму, делать свое дело (проверять, удалять и пр.) и вновь переходить в режим засыпания. При этом сам бот вообще никоим образом не знает (и не влияет) на порожденный процесс. Как и наоборот.
Harismatik
passant
О параллельных процессах слыхали?1. Создаете отдельный процесс. Как - зависит от логики вашего приложения, который вы таинственно скрываете. Может- как совершенно отдельный процесс. Может ваш бот сам порождает этот процесс. Может еще каким образом.2. Теперь ваш порожденный процесс (если он создан правильно) живет отдельной жизнью и никак не влияет на породивший его процесс. Соответственно, sleep в порожденном процессе никак не влияет (не тормозит) породивший его процесс. 3. Просыпаться этот процесс может по известному вам алгоритму, делать свое дело (проверять, удалять и пр.) и вновь переходить в режим засыпания. При этом сам бот вообще никоим образом не знает (и не влияет) на порожденный процесс. Как и наоборот.
Ну ведь ни разу не секрет, я достаточно детально описал что делает бот)))
Есть примеры того, как создать отдельный процесс в котором будет постоянно выполнятся функция?
py.user.next
Harismatik
Это не так важно
Это самое важное - точно выразить задачу и все цели в ней, прежде чем начинать писать код. Вот у меня есть сомнение на этот счёт, что ты правильно всё сделал.

Harismatik
Весь функционал я уже реализовал
Так вот ниоткуда не следует, что его надо было реализовывать. Он может оказаться весь неправильно написанным изначально и весь великий труд запросто может оказаться напрасным.

Если оно изначально планировалось многопоточным, почему ты не сделал сразу её многопоточной? Значит, ты неправильно спроектировал программу. И то, что ты там её долго и много писал, погоды не меняет.
vic57
*nix - https://losst.ru/nastrojka-cron
win - https://github.com/nnCron/nnCron/
passant
Harismatik
Есть примеры того, как создать отдельный процесс в котором будет постоянно выполнятся функция?
Конечно есть.
Если не нравиться приведенные выше источники по Cron и хочется остаться чисто в среде Python, то, например, всем хорошо известный Лутц “Программирование на Python”, том 1, стр. 259.
Или любая другая серьезная книга по Python.
Наконец , документация - отличный иcточник информации: https://docs.python.org/3.6/library/multiprocessing.html
PEHDOM
 from threading import Timer
def job_function():
    Timer(10, job_function).start ()
    print("Hello word")
job_function()
печатает “Hello word” каждые 10 секунд..

А вообще все уже украдено придумано до нас.
например модуль APsheduller https://apscheduler.readthedocs.io/en/latest/userguide.html
или shed https://docs.python.org/3/library/sched.html

например:
 from apscheduler.schedulers.blocking import BlockingScheduler
sched = BlockingScheduler()
@sched.scheduled_job('interval', seconds=10)    # запускать задание каждые 10 сек
def timed_job():
    print('This job is run every 10 seconds.')
@sched.scheduled_job('cron', day_of_week='mon-fri', hour=10)  # запускать c понедельника по пятницу в 10.00
def scheduled_job():
    print('This job is run every weekday at 10am.')
sched.start()
подробнее тут http://apscheduler.readthedocs.io/en/latest/modules/triggers/cron.html
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB