escenarios de planificación de tareas
Los llamados medios de programación de tareas programar el plan de ejecución de la tarea que cuando se implementa, la forma de ejecución. A menudo figuran en proyectos reales; en proyectos de datos particulares, tales como estadísticas en tiempo real las visitas al sitio cada 5 minutos, es necesario analizar cada 5 minutos cronometrados tráfico de datos de registro.
Resumen Los siguientes escenarios de programación de tareas:
- Desconectado planificación de tareas: un tiempo de ejecución de la tarea granularidad
- actualización de caché compartida: la hora de actualizar la caché, tales como Redis caché; compartir datos entre diferentes procesos
herramienta de programación de tareas
- crontab de Linux, compatible con la hora / día / mes / tamaño minuto / semana, realizar tareas de conformidad con
- Cuarzo de java
- Programador de tareas de Windows
Este artículo está sobre el pitón en la biblioteca de programación de tareas, APScheduler (avance pitón programador). Si sabes de cuarzo, se puede ver que se logrará la pitón cuarzo APScheduler; APScheduler proporciona tiempo, un punto fijo en el tiempo y la tarea llama al programa crontab basado en la forma, que puede ser utilizado como una herramienta de programación multiplataforma para su uso.
APScheduler
Introducción a los componentes
APScheduler consta de cinco partes: el gatillo, un planificador, una tarea de memoria, y unos acontecimientos ejecutor de tareas.
- Grupo de trabajo: tareas de identificación y ejecución de la tarea func
- disparadores de activación: determinar cuándo iniciar la ejecución de la tarea
- Tarea tiendas de trabajo de memoria: guardar el estado de la tarea
- ejecutores de actuador: cómo determinar la ejecución de la tarea
- Tarea de sucesos del suceso: supervisión anomalías de ejecución de tareas
- Los programadores planificador: todo el ciclo de vida de una serie de tareas de editar, añadir
任务
a任务存储器
, en任务
el momento del tiempo de ejecución de la llegada, para任务
dar执行器
cumplimiento a los resultados de retorno; también emitió un monitor de eventos, el monitor任务事件
.
instalar
pip install apscheduler
Un ejemplo sencillo
from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.executors.pool import ThreadPoolExecutor, ProcessPoolExecutor
from apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStore
from apscheduler.events import EVENT_JOB_EXECUTED, EVENT_JOB_ERROR
import logging
import datetime
# 任务执行函数
def job_func(job_id):
print('job %s is runed at %s' % (job_id, datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')))
# 事件监听
def job_exception_listener(event):
if event.exception:
# todo:异常处理, 告警等
print('The job crashed :(')
else:
print('The job worked :)')
# 日志
logging.basicConfig()
logging.getLogger('apscheduler').setLevel(logging.DEBUG)
# 定义一个后台任务非阻塞调度器
scheduler = BackgroundScheduler()
# 添加一个任务到内存中
# 触发器:trigger='interval' seconds=10 每10s触发执行一次
# 执行器:executor='default' 线程执行
# 任务存储器:jobstore='default' 默认内存存储
# 最大并发数:max_instances
scheduler.add_job(job_func, trigger='interval', args=[1], id='1', name='a test job', max_instances=10, jobstore='default', executor='default', seconds=10)
# 设置任务监听
scheduler.add_listener(job_exception_listener, EVENT_JOB_EXECUTED | EVENT_JOB_ERROR)
# 启动调度器
scheduler.start()
operación:
job 1 is runed at 2020-03-21 20:00:38
The job worked :)
job 1 is runed at 2020-03-21 20:00:48
The job worked :)
job 1 is runed at 2020-03-21 20:00:58
The job worked :)
gatillo
Gatillo decidir cuándo realizar la tarea, APScheduler soporta tres tipos de disparadores
- gatillo = 'intervalo': la realización de un período fijo de tiempo, semanas de apoyo, día, hora, minuto, segundo, el tiempo especificado pueden variar
sched.add_job(job_function, 'interval', hours=2, start_date='2010-10-10 09:30:00', end_date='2014-06-15 11:00:00')
- gatillo = 'fecha': tiempo fijo, lleve a cabo una
sched.add_job(my_job, 'date', run_date=datetime(2009, 11, 6, 16, 30, 5), args=['text'])
- gatillo = 'cron': el apoyo manera crontab, la misión
- Parámetros: hora / día / mes / tamaño de partícula minutos / semana también se puede especificar plazo
year (int|str) – 4-digit year
month (int|str) – month (1-12)
day (int|str) – day of the (1-31)
week (int|str) – ISO week (1-53)
day_of_week (int|str) – number or name of weekday (0-6 or mon,tue,wed,thu,fri,sat,sun)
hour (int|str) – hour (0-23)
minute (int|str) – minute (0-59)
second (int|str) – second (0-59)
start_date (datetime|str) – earliest possible date/time to trigger on (inclusive)
end_date (datetime|str) – latest possible date/time to trigger on (inclusive)
- ejemplo
# 星期一到星期五,5点30执行任务job_function,直到2014-05-30 00:00:00
sched.add_job(job_function, 'cron', day_of_week='mon-fri', hour=5, minute=30, end_date='2014-05-30')
# 按照crontab格式执行, 格式为:分钟 小时 天 月 周,*表示所有
# 5月到8月的1号到15号,0点0分执行任务job_function
sched.add_job(job_function, CronTrigger.from_crontab('0 0 1-15 may-aug *'))
actuador
Actuador decidir cómo realizar tareas; APScheduler soporta cuatro actuadores diferentes, piscina de uso común (hilo / proceso) y GEvent (io multiplexor que soporta alta de concurrencia), el grupo de subprocesos por defecto a la piscina, diferentes actuadores pueden configuración (scheduler See) en la configuración del planificador
- apscheduler.executors.asyncio: io sincrónica, obstrucción
- apscheduler.executors.gevent: io multiplexados, no bloqueante
- apscheduler.executors.pool: hilos ThreadPoolExecutor y procesos ProcessPoolExecutor
- apscheduler.executors.twisted: orientada a eventos
la memoria de tareas
Decide que el mandato de la memoria de trabajo el modo de ahorro, el valor predeterminado se almacena en la memoria (MemoryJobStore), reinicio después no. APScheduler tareas de soporte de memoria son:
- apscheduler.jobstores.memory: 内存
- apscheduler.jobstores.mongodb: almacenado en mongodb
- apscheduler.jobstores.redis: almacenado en Redis
- apscheduler.jobstores.rethinkdb: almacenado en rethinkdb
- bases de datos SQLAlchemy de apoyo tales como MySQL, sqlite, etc.: apscheduler.jobstores.sqlalchemy
- apscheduler.jobstores.zookeeper: Zookeeper
Las diferentes tareas se pueden configurar en el programador de la memoria de configuración (vea Programador)
Programador
APScheduler apoyado programador sigue, que es más comúnmente utilizado y BackgroundScheduler BlockingScheduler
- BlockingScheduler: adecuado para el planificador de procesos es el proceso sólo correr, llamar a los bloques de función de inicio del hilo actual pueden no respondieron de inmediato.
- BackgroundScheduler: adecuado para aplicaciones de programación que se ejecuta en segundo plano y no bloquea la llamada emperador comienzo de la rosca.
- AsyncIOScheduler: adecuado para aplicaciones que utilizan asyncio módulo.
- GeventScheduler: adecuado para las aplicaciones que utilizan el módulo GEvent.
- TwistedScheduler: Twisted adecuado para la creación de aplicaciones.
- QtScheduler: adecuado para la creación de aplicaciones Qt.
A partir del ejemplo anterior, podemos ver, el programador de tareas puede operar (y especifica el gatillo, y la tarea de memoria ejecutor de tareas) y las tareas de supervisión.
scheduler.add_job(job_func, trigger='interval', args=[1], id='1', name='a test job', max_instances=10, jobstore='default', executor='default', seconds=10)
Echemos un vistazo a cada parte en detalle
-
El planificador de configuración: add_job vemos JobStore y ejecutor son los predeterminados, APScheduler puede asignar diferentes tareas se almacenan en la definición e implementación de la agenda, y los parámetros iniciales
from pytz import utc
from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.jobstores.mongodb import MongoDBJobStore
from apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStore
from apscheduler.executors.pool import ThreadPoolExecutor, ProcessPoolExecutor
# 通过dict方式执行不同的jobstores、executors和默认的参数
jobstores = {
'mongo': MongoDBJobStore(),
'default': SQLAlchemyJobStore(url='sqlite:///jobs.sqlite')
}
executors = {
'default': ThreadPoolExecutor(20),
'processpool': ProcessPoolExecutor(5)
}
job_defaults = {
'coalesce': False,
'max_instances': 3
}
# 定义调度器
scheduler = BackgroundScheduler(jobstores=jobstores, executors=executors, job_defaults=job_defaults, timezone=utc)
def job_func(job_id):
print('job %s is runed at %s' % (job_id, datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')))
# 添加任务
scheduler.add_job(job_func, trigger='interval', args=[1], id='1', name='a test job', jobstore='default', executor='processpool', seconds=10)
# 启动调度器
scheduler.start()
-
tareas operativas: programador puede añadir, eliminar, pausar, reanudar y modificar tareas. Cabe señalar aquí que la tarea de operar sólo en las obras de tareas pendientes de ejecución se han aplicado y no se ven afectados por la ejecución de estas operaciones.
- add_job
scheduler.add_job(job_func, trigger='interval', args=[1], id='1', name='a test job', max_instances=10, jobstore='default', executor='default', seconds=10)
- remove_job: La única vez a través de la identificación de tareas, elimine se suprime la tarea correspondiente en la memoria
scheduler.add_job(myfunc, 'interval', minutes=2, id='my_job_id')
scheduler.remove_job('my_job_id')
- Detener y reanudar trabajos: pausa y reiniciar la tarea
scheduler.add_job(myfunc, 'interval', minutes=2, id='my_job_id')
scheduler.pause_job('my_job_id')
scheduler.resume_job('my_job_id')
- Modificar los trabajos de: Modificar la configuración de la tarea
job = scheduler.add_job(myfunc, 'interval', minutes=2, id='my_job_id', max_instances=10)
# 修改任务的属性
job.modify(max_instances=6, name='Alternate name')
# 修改任务的触发器
scheduler.reschedule_job('my_job_id', trigger='cron', minute='*/5')
-
Misión de tipo de evento, tipos de uso común son:
-
EVENT_JOB_ERROR: indica que la tarea se activa en caso de proceso de ejecución anormal
-
EVENT_JOB_EXECUTED: éxito la ejecución de tareas
-
EVENT_JOB_MAX_INSTANCES: parámetro de ejecución de la tarea supera un planificador configurado en
scheduler.add_listener(job_exception_listener, EVENT_JOB_EXECUTED | EVENT_JOB_ERROR)
Documento de referencia: https: //apscheduler.readthedocs.io/en/stable/userguide.html