Планировщик задач на Python
В стандартной библотеке есть встроенный планировщик задач (а чего вообще в ней нет?). Подробно расскажу в другой раз, но в целом он, скажем так, не слишком юзер-френдли.
Поэтому Дэн Бэйдер сделал schedule — «планировщик для людей». Смотрите, какой милый:
import schedule import time def job(): print("I'm working. ") schedule.every().hour.do(job) schedule.every(5).to(10).minutes.do(job) schedule.every().day.at("10:30").do(job) while True: schedule.run_pending() time.sleep(1)
Ноль зависимостей, чистый и великолепно документированный код, примеры на все случаи жизни.
Подписывайтесь на канал, чтобы не пропустить новые заметки
python как создать декоратор для планировщика Schedule
В отличие от обычных декораторов тут не нужно оборачивать функцию во wrapper, просто возвращаем ее же, но перед этим создаем объект Job() с помощью функции every() , и вызываем job.do(func) .
import datetime import schedule import time import threading def run_pending(): while True: schedule.run_pending() time.sleep(0.1) # daemon=True значит что этот поток будет работать, пока работает пока работает основной поток threading.Thread(target=run_pending, daemon=True).start() def scheduler(**interval_args): # Получаем имя и значение параметра, например unit='seconds'; interval=10 unit, interval = list(interval_args.items())[0] # Параметр должен быть обязательно передан, иначе будет IndexError job = schedule.every(interval) # Немного некорректно прописывать `unit` напрямую в обход свойств `.seconds`/`.minutes`/`.hour` и т.д., # но работать тем не менее будет job.unit = unit def decorator(func): job.do(func) return func # Возвращаем саму функцию, никак не заменяя return decorator # ---- @scheduler(seconds=1) # единица_измерения=интервал def geeks(): print("geeks") print(f"Ready and datetime_now :") thread_name = threading.current_thread().name print(f"Thread_name: ") print() @scheduler(seconds=2) def geeks_2(): print("geeks2") print(f"\nWoW + datetime_now : ") thread_name = threading.current_thread().name print(f"Thread_name: ") print() while True: time.sleep(10)
Можно упростить код декоратора, если передавать в него параметром объект Job , который возвращается функцией every() (только не добавлять в конце .do() ), тогда синтаксис задания интервала будет «унаследован» от библиотеки schedule :
def schedule_job(job: schedule.Job): def decorator(func): job.do(func) return func return decorator # ---- # Для укорочения записи интервалов импортируем every from schedule import every @schedule_job(every().second) def geeks(): print("geeks") print(f"Ready and datetime_now :") thread_name = threading.current_thread().name print(f"Thread_name: ") print() @schedule_job(every(2).seconds) def geeks_2(): print("geeks2") print(f"\nWoW + datetime_now : ") thread_name = threading.current_thread().name print(f"Thread_name: ") print()
И аналогично @schedule_job(every().week) , @schedule_job(every().wednesday.at(«13:15»)) , и т.д.
UPD. оказалось, в библиотеке schedule уже есть свой декоратор, причем на 90% процентов совпадает с моим вторым вариантом (в отличие от моего варианта есть еще возможность передачи параметров из декоратора в декорируемую функцию):
def repeat(job, *args, **kwargs): """ Decorator to schedule a new periodic job. Any additional arguments are passed on to the decorated function when the job runs. :param job: a :class:`Jobs ` """ def _schedule_decorator(decorated_function): job.do(decorated_function, *args, **kwargs) return decorated_function return _schedule_decorator
Как создать планировщик задач на Питоне?
Есть вводимые данные — сама задача(что необходимо сделать к промежутку времени). Есть промежуток времени вводимый через input и datetime. В дальнейшем хочу подключить графику(скорее всего tkinter).
Суть вопроса, (а) как мне сделать данные не вводимые с клавиатуры, а выбираемые,допустим, роликом(как на телефоне).
(б) Как сделать так, чтобы в определенное время выводил задачу.
from datetime import date import datetime now = datetime.datetime.now() plan = input("Enter you plans: ") deadline = datetime.datetime(year=int(input('Year: ')), month=int(input('Month: ')), day=int(input('Day: ')), hour=int(input('Hour: '))) a = [] a.append(plan) time = [] time.append(deadline) if now
- Вопрос задан более трёх лет назад
- 1058 просмотров
Комментировать
Решения вопроса 0
Ответы на вопрос 0
Ваш ответ на вопрос
Войдите, чтобы написать ответ
- Telegram
- +3 ещё
Можно ли в telegram помеченные ключевым словом сообщения в группе автоматически переносить в другой чат группы?
- 2 подписчика
- 01 окт.
- 115 просмотров
Делаем свой планировщик задач
Трелло — удобная штука для ведения проектов. Там все задачи представлены в виде колонок, а каждая колонка отвечает за что-то своё. Давайте сделаем нечто подобное, тем более что всё для этого у нас уже есть:
- Bootstrap, с которым мы познакомились, пока создавали страницы с котиками;
- список задач, где можно добавлять новые и удалять ненужные пункты.
Если это объединить, получится что-то похожее на Trello. Логика такая:
- у нас будет несколько колонок на странице (за это отвечает Bootstrap);
- каждая колонка будет отвечать за свои задачи и называться по-своему;
- в каждой колонке можно добавлять и удалять задачи независимо от остальных (а за это отвечает скрипт из прошлого списка задач).
Мы сделаем 4 колонки, но вы для себя можете сделать их столько, сколько нужно. Единственное ограничение — Bootstrap не позволяет делать больше 12 колонок. Надеемся, вам этого хватит.
Готовим колонки и настраиваем стили
За основу возьмём страницу из статьи про котиков и сделаем с ней следующее:
- перенесём в неё стили из страницы со списком задач;
- добавим недостающие стили для заголовков колонок и всей страницы;
- подготовим пустые 4 колонки и настроим их размер под разную ширину экрана.
Если мы всё сделаем правильно, то получится следующее:
Управление проектами Управление проектами, делами и собой


