Форум сайта python.su
0
Всем привет, создаю Discord бота на великом Python. Столкнулся с острой необходимостью выполнения части кода / отдельной функции, каждые 15 минут и другой части каждый день в полночь. Простейший метод через while True - sleep не работает, так как он просто парализует работу всего бота. Встречал иногда на просторах интернета библиотеку Scheduler, но так и не понял что к чему и как нею пользоваться. Возможно, среди вас найдётся ВЕЛИКИЙ человек, с неизмеримым багажом знаний, что поможет реализовать мою задумку.
Отредактировано Harismatik (Фев. 27, 2018 02:08:25)
Офлайн
857
Конкретнее задачу опиши.
HarismatikЧто он делает?
создаю Discord бота
Офлайн
0
Это не так важно…. Пользователи с помощью команды устанавливают себе настройки (роли, ники и тд..). Все эти данные записываются в .json. Бот должен каждую полночь открывать этот файл и проверять каждого пользователя является ли он ещё участником сервера, если нет - удаляет его данные. Весь функционал я уже реализовал, но эту функцию “проверки” приходится запускать вручную. Читал так-же про Cron, но так и не нашёл понятного гайда… Использования sleep вообще никак не катит, так как тормозит всего бота.
Отредактировано Harismatik (Фев. 27, 2018 14:43:48)
Офлайн
4
О параллельных процессах слыхали?
1. Создаете отдельный процесс. Как - зависит от логики вашего приложения, который вы таинственно скрываете. Может- как совершенно отдельный процесс. Может ваш бот сам порождает этот процесс. Может еще каким образом.
2. Теперь ваш порожденный процесс (если он создан правильно) живет отдельной жизнью и никак не влияет на породивший его процесс. Соответственно, sleep в порожденном процессе никак не влияет (не тормозит) породивший его процесс.
3. Просыпаться этот процесс может по известному вам алгоритму, делать свое дело (проверять, удалять и пр.) и вновь переходить в режим засыпания. При этом сам бот вообще никоим образом не знает (и не влияет) на порожденный процесс. Как и наоборот.
Отредактировано passant (Фев. 27, 2018 18:00:51)
Офлайн
0
passantНу ведь ни разу не секрет, я достаточно детально описал что делает бот)))
О параллельных процессах слыхали?1. Создаете отдельный процесс. Как - зависит от логики вашего приложения, который вы таинственно скрываете. Может- как совершенно отдельный процесс. Может ваш бот сам порождает этот процесс. Может еще каким образом.2. Теперь ваш порожденный процесс (если он создан правильно) живет отдельной жизнью и никак не влияет на породивший его процесс. Соответственно, sleep в порожденном процессе никак не влияет (не тормозит) породивший его процесс. 3. Просыпаться этот процесс может по известному вам алгоритму, делать свое дело (проверять, удалять и пр.) и вновь переходить в режим засыпания. При этом сам бот вообще никоим образом не знает (и не влияет) на порожденный процесс. Как и наоборот.
Офлайн
857
HarismatikЭто самое важное - точно выразить задачу и все цели в ней, прежде чем начинать писать код. Вот у меня есть сомнение на этот счёт, что ты правильно всё сделал.
Это не так важно
HarismatikТак вот ниоткуда не следует, что его надо было реализовывать. Он может оказаться весь неправильно написанным изначально и весь великий труд запросто может оказаться напрасным.
Весь функционал я уже реализовал
Отредактировано py.user.next (Фев. 28, 2018 00:33:46)
Офлайн
4
HarismatikКонечно есть.
Есть примеры того, как создать отдельный процесс в котором будет постоянно выполнятся функция?
Офлайн
294
from threading import Timer def job_function(): Timer(10, job_function).start () print("Hello word") job_function()
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()
[code python][/code]
Отредактировано PEHDOM (Фев. 28, 2018 21:24:41)
Офлайн