Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 27, 2018 02:04:33

Harismatik
Зарегистрирован: 2018-02-27
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Выполнение по расписанию

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

Отредактировано Harismatik (Фев. 27, 2018 02:08:25)

Офлайн

#2 Фев. 27, 2018 03:12:38

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10020
Репутация: +  857  -
Профиль   Отправить e-mail  

Выполнение по расписанию

Конкретнее задачу опиши.

Harismatik
создаю Discord бота
Что он делает?



Офлайн

#3 Фев. 27, 2018 14:42:48

Harismatik
Зарегистрирован: 2018-02-27
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Выполнение по расписанию

Это не так важно…. Пользователи с помощью команды устанавливают себе настройки (роли, ники и тд..). Все эти данные записываются в .json. Бот должен каждую полночь открывать этот файл и проверять каждого пользователя является ли он ещё участником сервера, если нет - удаляет его данные. Весь функционал я уже реализовал, но эту функцию “проверки” приходится запускать вручную. Читал так-же про Cron, но так и не нашёл понятного гайда… Использования sleep вообще никак не катит, так как тормозит всего бота.

Отредактировано Harismatik (Фев. 27, 2018 14:43:48)

Офлайн

#4 Фев. 27, 2018 17:59:11

passant
Зарегистрирован: 2018-02-17
Сообщения: 43
Репутация: +  4  -
Профиль   Отправить e-mail  

Выполнение по расписанию

О параллельных процессах слыхали?
1. Создаете отдельный процесс. Как - зависит от логики вашего приложения, который вы таинственно скрываете. Может- как совершенно отдельный процесс. Может ваш бот сам порождает этот процесс. Может еще каким образом.
2. Теперь ваш порожденный процесс (если он создан правильно) живет отдельной жизнью и никак не влияет на породивший его процесс. Соответственно, sleep в порожденном процессе никак не влияет (не тормозит) породивший его процесс.
3. Просыпаться этот процесс может по известному вам алгоритму, делать свое дело (проверять, удалять и пр.) и вновь переходить в режим засыпания. При этом сам бот вообще никоим образом не знает (и не влияет) на порожденный процесс. Как и наоборот.

Отредактировано passant (Фев. 27, 2018 18:00:51)

Офлайн

#5 Фев. 27, 2018 22:41:53

Harismatik
Зарегистрирован: 2018-02-27
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Выполнение по расписанию

passant
О параллельных процессах слыхали?1. Создаете отдельный процесс. Как - зависит от логики вашего приложения, который вы таинственно скрываете. Может- как совершенно отдельный процесс. Может ваш бот сам порождает этот процесс. Может еще каким образом.2. Теперь ваш порожденный процесс (если он создан правильно) живет отдельной жизнью и никак не влияет на породивший его процесс. Соответственно, sleep в порожденном процессе никак не влияет (не тормозит) породивший его процесс. 3. Просыпаться этот процесс может по известному вам алгоритму, делать свое дело (проверять, удалять и пр.) и вновь переходить в режим засыпания. При этом сам бот вообще никоим образом не знает (и не влияет) на порожденный процесс. Как и наоборот.
Ну ведь ни разу не секрет, я достаточно детально описал что делает бот)))
Есть примеры того, как создать отдельный процесс в котором будет постоянно выполнятся функция?

Офлайн

#6 Фев. 28, 2018 00:32:42

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10020
Репутация: +  857  -
Профиль   Отправить e-mail  

Выполнение по расписанию

Harismatik
Это не так важно
Это самое важное - точно выразить задачу и все цели в ней, прежде чем начинать писать код. Вот у меня есть сомнение на этот счёт, что ты правильно всё сделал.

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

Если оно изначально планировалось многопоточным, почему ты не сделал сразу её многопоточной? Значит, ты неправильно спроектировал программу. И то, что ты там её долго и много писал, погоды не меняет.



Отредактировано py.user.next (Фев. 28, 2018 00:33:46)

Офлайн

#7 Фев. 28, 2018 09:44:51

vic57
Зарегистрирован: 2015-07-07
Сообщения: 913
Репутация: +  127  -
Профиль  

Выполнение по расписанию

Офлайн

#8 Фев. 28, 2018 15:18:05

passant
Зарегистрирован: 2018-02-17
Сообщения: 43
Репутация: +  4  -
Профиль   Отправить e-mail  

Выполнение по расписанию

Harismatik
Есть примеры того, как создать отдельный процесс в котором будет постоянно выполнятся функция?
Конечно есть.
Если не нравиться приведенные выше источники по Cron и хочется остаться чисто в среде Python, то, например, всем хорошо известный Лутц “Программирование на Python”, том 1, стр. 259.
Или любая другая серьезная книга по Python.
Наконец , документация - отличный иcточник информации: https://docs.python.org/3.6/library/multiprocessing.html

Офлайн

#9 Фев. 28, 2018 21:12:23

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Выполнение по расписанию

 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



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Фев. 28, 2018 21:24:41)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version