Programación de tareas de sincronización de Python vs.Apio vs.APScheduler

En el proceso de desarrollo de Python, a menudo necesitamos realizar tareas de sincronización, y para tales tareas, generalmente tenemos las siguientes opciones:

  • Haz tus propias ruedas
  • Usar biblioteca de horarios
  • Utilice tareas cronometradas de apio
  • Utilice APScheduler

La mayor ventaja de hacer sus propias ruedas para la implementación es la flexibilidad y la fácil depuración.También puede ser una opción para ciertos sistemas específicos, pero para la mayoría de las aplicaciones, deberíamos usar soluciones maduras de código abierto tanto como sea posible. Las siguientes tres opciones se analizan por separado:

Usar biblioteca de horarios

La biblioteca de programación es una solución liviana de tareas cronometradas, la ventaja es que es fácil de usar y no requiere ninguna configuración, la desventaja es que no puede agregar tareas de forma dinámica, ni puede conservar las tareas.

instalación

 

pip install schedule

usar

 

import schedule
import time

def job():
    print("I'm working...")

schedule.every(10).minutes.do(job)
schedule.every().hour.do(job)
schedule.every().day.at("10:30").do(job)
schedule.every(5).to(10).minutes.do(job)
schedule.every().monday.do(job)
schedule.every().wednesday.at("13:15").do(job)

while True:
    schedule.run_pending()
    time.sleep(1)

Utilizar apio

El apio es bien conocido en el campo de Python. Por lo general, usamos Celery como una cola de tareas, pero Celery también proporciona tareas de sincronización. Por lo general, cuando Celery ya se usa en nuestra solución, podemos considerar usar su función de tarea de sincronización al mismo tiempo, pero Celery no puede agregar tareas de sincronización dinámicamente en un sistema como Flask (hay un complemento correspondiente en Django que puede agregar dinámicamente tareas), y para proyectos que no usan Apio, sería demasiado pesado construir Apio solo para tareas cronometradas. (Crear apio es más problemático y también necesita configurar un programa de distribución de mensajes como RabbitMQ).

La instalación de apio no se repite aquí, puede consultar la información en el sitio web oficial

usar

Aunque Celery no puede agregar tareas cronometradas de forma dinámica, puede agregar tareas cronometradas en una ubicación fija en el programa, de la siguiente manera:

 

from celery import Celery
from celery.schedules import crontab

app = Celery()

# 此处on_after_configure装饰符意味着当Celery app配置完成之后调用该hook函数
@app.on_after_configure.connect
def setup_periodic_tasks(sender, **kwargs):
    # Calls test('hello') every 10 seconds.
    sender.add_periodic_task(10.0, test.s('hello'), name='add every 10')

    # Calls test('world') every 30 seconds
    sender.add_periodic_task(30.0, test.s('world'), expires=10)

    # Executes every Monday morning at 7:30 a.m.
    sender.add_periodic_task(
        crontab(hour=7, minute=30, day_of_week=1),
        test.s('Happy Mondays!'),
    )

@app.task
def test(arg):
    print(arg)
  • Esta llamada se add_periodic_taskusa para agregar una tarea de tiempo, que es equivalente a agregar un elemento al elemento de configuración beat_schedule en el archivo de configuración de Celery, de la siguiente manera:
    app.conf.beat_schedule = {
        'add-every-30-seconds': {
            'task': 'tasks.add',
            'schedule': 30.0,
            'args': (16, 16)
        },
    }
    
  • En add_periodic_taskel tiempo especificado por la función de trabajo necesita .s()llamar

Utilice APScheduler

El autor cree que APScheduler es la mejor biblioteca de herramientas para usar en proyectos reales. No solo nos permite agregar y eliminar dinámicamente nuestras tareas de sincronización en el programa, sino que también admite la persistencia, y su esquema de persistencia admite muchas formas, incluidas (Memory, MongoDB, SQLAlchemy, Redis, RethinkDB, ZooKeeper), y también puede ser muy bien Integrarme con algunos frameworks de Python (incluyendo asyncio, gevent, Tornado, Twisted, Qt) El proyecto en el que trabajo usa el framework Flask, y hay plug-ins correspondientes para que los usemos directamente.

Pero el autor no usó el complemento, sino que integró directamente APScheduler en el código del proyecto.

Inicializar el planificador

 

# 可以在初始化Flask的时候调用,并将返回的scheduler赋给app
def init_scheduler():
    # 这里用于持久化的设置,代码中演示使用MongoDB
    # client用于设置你自己的MongoDB的handler, 即MongoClient对象
    jobstores = {
        'default': MongoDBJobStore(client=your_db_handler, collection="schedule_job")
    }
    executors = {
        'default': ThreadPoolExecutor(20)
    }
    job_defaults = {
        'coalesce': False,
        'max_instances': 5
    }
    # 这里使用BackgroundScheduler即可
    scheduler = BackgroundScheduler(jobstores=jobstores, executors=executors, job_defaults=job_defaults, timezone=utc)
    # 注意这里一定要调用start启动scheduler
    scheduler.start()
    return scheduler

Agregar una tarea programada

APScheduler divide las tareas de cronometraje en tres tipos:

  • intervalo: por ejemplo, ejecute una tarea cada 5 minutos
  • cron: por ejemplo, ejecute una tarea a las 5 a.m. todos los días
  • fecha: por ejemplo, realizar una tarea el 5 de mayo de 2018

Tomemos como ejemplo la adición de un trabajo cron:

 

def test_job(name):
    print "hello, %s" % name
    
def add_daily_job(name):
    exec_time = datetime.now() + timedelta(minutes=2)
    hour = exec_time.strftime("%H")
    minute = exec_time.strftime("%M")
    # 这里要选择'cron'
    # 另外,job_id可以根据你自己的情况设定,其会被用于remove_job
    current_app.scheduler.add_job(
        test_job, 'cron', hour=hour, minute=minute,
        args=[name], id=job_id)

Eliminar tareas programadas

La tarea cronometrada correspondiente se puede eliminar mediante el job_id utilizado en add_job. De hecho, cuando agregamos una tarea, APScheduler almacenará la información de la tarea correspondiente en el esquema de almacenamiento persistente establecido en nuestro almacén de trabajo. Aquí se usa MongoDB, y luego la tarea correspondiente se eliminará de MongoDB cuando se elimine.

 

def remove_daily_job(job_id):
    current_app.scheduler.remove_job(job_id)

para resumir:

APScheduler tiene la mayor flexibilidad en el uso real y puede satisfacer la mayoría de nuestras necesidades relacionadas con las tareas de sincronización; El apio es relativamente pesado, generalmente si Apio ya está en uso en el proyecto, y no necesita agregar dinámicamente tareas de sincronización, puede considerar usar It; Schedule es muy liviano y fácil de usar, pero no admite la persistencia de tareas, ni puede agregar y eliminar tareas dinámicamente, por lo que se usa principalmente para aplicaciones pequeñas y simples.

Referencias



Autor:
enlace geekpy : https: //www.jianshu.com/p/94b273f6ed77
Fuente: Los libros de Jane
tienen derechos de autor del autor. Para reimpresiones comerciales, comuníquese con el autor para obtener autorización, y para reimpresiones no comerciales, indique la fuente.

Supongo que te gusta

Origin blog.csdn.net/smilejiasmile/article/details/111839389
Recomendado
Clasificación