1. Введение
Полное название APScheduler — Advanced Python Scheduler. Это облегченная среда планирования задач Python. APScheduler поддерживает три задачи планирования: фиксированный интервал времени, фиксированный момент времени (дата) и команду Crontab в Linux. В то же время он также поддерживает асинхронное выполнение и фоновое выполнение запланированных задач.
2. Установка
Установка APScheduler с помощью инструмента управления пакетами pip является наиболее удобной и быстрой.
pip install APScheduler
3. Используйте шаги
APScheduler относительно прост в использовании. Для запуска запланированной задачи требуется только следующие три шага.
Создайте новый планировщик (scheduler). Добавьте задание планировщика (хранилища заданий). Запустите запланированное задание.
Ниже приведен простой пример кода для выполнения запланированной задачи.
#!/usr/bin/env python
# coding:utf-8
import time
from apscheduler.schedulers.blocking import BlockingScheduler
import logging
LOG_FORMAT = "%(asctime)s - %(levelname)s - %(message)s"
logging.basicConfig(filename='mypython.log', level=logging.INFO, format=LOG_FORMAT)
today = time.strftime('%Y%m%d', time.localtime(time.time()))
nowDateTime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
global num
num = 0
class myAP:
def __init__(self):
print("hello")
def sayHello():
global num
num = num + 1
print(nowDateTime+' 任务一 hello word %d' % num)
def sayHello11():
global num
num = num + 1
print(nowDateTime+' 任务二 o(* ̄︶ ̄*)o hello word %d' % num)
if __name__ == "__main__":
# BlockingScheduler
scheduler = BlockingScheduler()
# scheduler.add_job(sayHello, 'cron', day_of_week='0-6', hour=19, minute=50)
scheduler.add_job(sayHello, 'interval', seconds=2)
scheduler.add_job(sayHello11, 'interval', seconds=3)
scheduler.start()
Результат выполнения показан на рисунке
4. Основные компоненты
APScheduler состоит из четырех компонентов, а именно: планировщик, хранилище заданий, триггер и исполнитель.
планировщикиЭто планировщик задач и принадлежит роли контроллера. Он настраивает память заданий и исполнителей, которые можно выполнять в планировщике, например, добавлять, изменять и удалять задания.
триггерыОписывает условия, при которых запускается запланированная задача. Но триггеры совершенно не имеют состояния.
магазины вакансийХранилище сохранения задач по умолчанию сохраняет задачи в памяти или сохраняет задачи в различных базах данных.Данные в задаче сериализуются и сохраняются в постоянной базе данных, а затем десериализуются после загрузки из базы данных.
исполнителиОтвечает за обработку выполнения заданий, которые обычно выполняются путем отправки указанных вызываемых объектов в задании в поток или в пул. Исполнитель уведомит планировщика о завершении задания.
4.1 планировщики
Лично я считаю APScheduler очень полезным. Он предоставляет 7 планировщиков для удовлетворения потребностей наших различных сценариев. Например: выполнить операцию в фоновом режиме, выполнить операцию асинхронно и т. д. Планировщики:
BlockingScheduler: Планировщик работает в основном потоке текущего процесса, то есть блокирует текущий поток. BackgroundScheduler: планировщик работает в фоновом потоке и не блокирует текущий поток. AsyncIOScheduler: используется вместе с модулем asyncio (асинхронная структура). GeventScheduler: программа использует gevent (высокопроизводительную среду параллелизма Python) в качестве модели ввода-вывода и работает с GeventExecutor. TornadoScheduler : в программе используется модель ввода-вывода Tornado (веб-фреймворк), а ioloop.add_timeout используется для завершения пробуждения по времени. TwistedScheduler: сотрудничайте с TwistedExecutor, используйте Reactor.callLater для завершения пробуждения по времени. QtScheduler: ваше приложение является приложением Qt и должно использовать QTimer для завершения запланированного пробуждения.
4.2 триггеры
APScheduler имеет три встроенных триггера: 1) триггер даты date — это самый простой вид планирования, и задача задания будет выполняться только один раз. Это указывает на триггер в определенный момент времени. Его параметры следующие:
| параметр | инструкция |
|---|---|
| run_date (datetime или str) | Дата или время выполнения задания |
| часовой пояс (datetime.tzinfo или str) | Укажите часовой пояс |
Пример использования триггера даты выглядит следующим образом:
from datetime import datetime
from datetime import date
from apscheduler.schedulers.background import BackgroundScheduler
def job_func(text):
print(text)
scheduler = BackgroundScheduler()
# 在 2017-12-13 时刻运行一次 job_func 方法
scheduler .add_job(job_func, 'date', run_date=date(2017, 12, 13), args=['text'])
# 在 2017-12-13 14:00:00 时刻运行一次 job_func 方法
scheduler .add_job(job_func, 'date', run_date=datetime(2017, 12, 13, 14, 0, 0), args=['text'])
# 在 2017-12-13 14:00:01 时刻运行一次 job_func 方法
scheduler .add_job(job_func, 'date', run_date='2017-12-13 14:00:01', args=['text'])
scheduler.start()
интервальный триггер
Запускается через равные промежутки времени. интервальное планирование, параметры следующие:
| параметр | инструкция |
|---|---|
| weeks (int) | с разницей в несколько недель |
| days (int) | несколько дней |
| hours (int) | несколько часов |
| minutes (int) | несколько минут друг от друга |
| seconds (int) | сколько секунд |
| start_date (datetime или str) | Дата начала |
| end_date (datetime или str) | Дата окончания |
| часовой пояс (datetime.tzinfo или str) | Часовой пояс |
хрон триггер
Запускается периодически в определенное время, совместимо с форматом crontab Linux. Это самый мощный триггер. Давайте сначала разберемся с параметром cron:
| параметр | инструкция |
|---|---|
| год (целое или ул.) | год, 4 цифры |
| месяц (int или str) | месяц (диапазон 1-12) |
| день (целое или ул.) | день (диапазон 1-31 |
| неделя (целая или ул) | Неделя (диапазон 1-53) |
| day_of_week (целое или ул) | День недели или день недели (диапазон 0–6 или пн, вт, ср, чт, пт, сб, вс) |
| час (целое или ул.) | часов (диапазон 0-23) |
| минута (int или str) | центов (диапазон 0-59) |
| секунда (int или str) | секунды (диапазон 0-59) |
| start_date (datetime или str) | Самая ранняя дата начала (включая) |
| end_date (datetime или str) | самое позднее время окончания (включительно) |
| часовой пояс (datetime.tzinfo или str) | Укажите часовой пояс |
Пример использования триггеров cron выглядит следующим образом:
import datetime
from apscheduler.schedulers.background import BackgroundScheduler
def job_func(text): print("当前时间:", datetime.datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S.%f")[:-3])
scheduler = BackgroundScheduler()
# 在每年 1-3、7-9 月份中的每个星期一、二中的 00:00, 01:00, 02:00 和 03:00 执行 job_func 任务
scheduler .add_job(job_func, 'cron', month='1-3,7-9',day='0, tue', hour='0-3')
scheduler.start()
4.3 Магазин вакансий
Этот компонент представляет собой управление задачами планирования. 1) Добавить работу Существует два метода добавления, один из которых — это add_job(), используемый приведенным выше кодом, а другой — декоратор Schedule_job() для украшения функции.
Разница между двумя методами заключается в том, что первый метод возвращает экземпляр apscheduler.job.Job, который можно использовать для изменения или удаления задания. Второй метод работает только для заданий, которые не изменяются во время работы приложения.
Пример второго способа добавления задач:
@scheduler.scheduled_job(job_func, 'interval', minutes=2)
def job_func(text):
print(datetime.datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S.%f")[:-3])
scheduler = BackgroundScheduler()
scheduler.start()
2) удалить работу Есть также два способа удалить задание: remove_job() и job.remove(). remove_job() предназначен для удаления на основе идентификатора задания, поэтому укажите идентификатор при создании задания. job.remove() должен выполнить метод удаления в задании.
scheduler.add_job(job_func, 'interval', minutes=2, id='job_one')
scheduler.remove_job(job_one)
job = add_job(job_func, 'interval', minutes=2, id='job_one')
job.remvoe()
3) Получить список вакансий Список всех заданий в текущем планировщике можно получить с помощью метода scheduler.get_jobs().
изменить работу Если вы хотите изменить задание из-за изменения расписания, вы можете использовать методы Job.modify() или modify_job() для изменения свойств задания. Но стоит отметить, что id задания изменить нельзя.
scheduler.add_job(job_func, 'interval', minutes=2, id='job_one')
scheduler.start()
# 将触发时间间隔修改成 5分钟
scheduler.modify_job('job_one', minutes=5)
job = scheduler.add_job(job_func, 'interval', minutes=2)
# 将触发时间间隔修改成 5分钟
job.modify(minutes=5)
5) Закрыть работу По умолчанию планировщик будет ждать завершения всех запущенных заданий, прежде чем закрыть все планировщики и хранилище заданий. Если вы не хотите ждать, вы можете установить для параметра ожидания значение False.
scheduler.shutdown()
scheduler.shutdown(wait=false)
4.4 Исполнитель
Исполнитель, как следует из названия, представляет собой модуль, выполняющий запланированные задачи. Есть два наиболее часто используемых исполнителя: ProcessPoolExecutor и ThreadPoolExecutor.
Ниже приведен пример кода, который явно настраивает хранилище заданий (с использованием хранилища mongo) и исполнителя.
from pymongo import MongoClient
from apscheduler.schedulers.blocking import BlockingScheduler
from apscheduler.jobstores.mongodb import MongoDBJobStore
from apscheduler.jobstores.memory import MemoryJobStore
from apscheduler.executors.pool import ThreadPoolExecutor, ProcessPoolExecutor
def my_job():
print 'hello world'
host = '127.0.0.1'
port = 27017
client = MongoClient(host, port)
jobstores = {
'mongo': MongoDBJobStore(collection='job', database='test', client=client),
'default': MemoryJobStore()
}
executors = {
'default': ThreadPoolExecutor(10),
'processpool': ProcessPoolExecutor(3)
}
job_defaults = {
'coalesce': False,
'max_instances': 3
}
scheduler = BlockingScheduler(jobstores=jobstores, executors=executors, job_defaults=job_defaults)
scheduler.add_job(my_job, 'interval', seconds=5)
try:
scheduler.start()
except SystemExit:
client.close()