Implemente la gestión de tareas programadas utilizando el módulo de programación integrado de Python

La gestión de tareas programadas es un requisito común en la programación.

A menudo nos encontramos con escenarios de aplicaciones que requieren tareas programadas. Como realizar copias de seguridad de la base de datos con regularidad, enviar mensajes de texto con regularidad, publicar información de suscripción y otros escenarios. Utilice el administrador de tareas de Windows y el crontab de Linux para administrar las tareas programadas, que deben agregarse manualmente. La carga de trabajo de configuración es pesada y no puede cumplir con el escenario de agregar tareas programadas automáticamente. Por supuesto, la gestión de tareas programadas se puede lograr a través de la biblioteca de terceros apio, pero el uso de apio es más complicado y requiere trabajo de desarrollo adicional.
La buena noticia es que la biblioteca estándar de Python proporciona un módulo integrado schedpara administrar tareas programadas, no depende de bibliotecas de terceros y es fácil de usar. Otro beneficio del módulo programado es que es independiente de la plataforma y puede ejecutarse en cualquier sistema operativo.

Pasos de programación para usar sched para administrar tareas programadas

1) Crear un nuevo objeto programado

import sched
import time
scheduler ``=` `sched.scheduler(time.time, time.sleep)

2) Definir la función de la tarea

La función de tarea contiene el trabajo que está programado para realizarse. Si es necesario realizar trabajos diferentes en dos momentos diferentes, la tarea debe dividirse en dos funciones de tarea.

3) Establecer el tiempo de ejecución de la tarea según los segundos de retraso

Utilice el método sched.enter() para programar tareas y el tiempo de ejecución se expresa como la cantidad de segundos retrasados ​​desde la hora actual.

gramática:scheduler.enter(delay, priority, action, argument=(), kwargs={})

Descripción de parámetros:

  • retraso: tiempo de retraso, la unidad es segundos
  • prioridad: prioridad
  • acción: función de tarea
  • argumento: lista de parámetros de función de tarea (formato de tupla)
  • Lista de parámetros variables de la función de tarea kwargs

4) Llame al método sched.run() para iniciar la supervisión de tareas programadas

Inicie la cola de tareas programadas y, una vez finalizado el tiempo de cada tarea, inicie la función de tarea. El objeto programado sale solo después de que se hayan ejecutado todas las tareas en la cola.

Agregar tareas por tiempo absoluto:

El método enter() agrega una tarea basada en la cantidad de segundos retrasados ​​​​desde la hora actual. Pero a menudo nos encontramos con escenarios que requieren que se realicen tareas en un momento determinado.

Uso; sched.enterabs()

Sintaxis: scheduler.enterabs(time, priority, action, argument=(), kwargs={})

Parámetros:

  • hora: hora en la que se ejecuta la tarea, que puede estar en formato de fecha y hora o hora de marca de estímulo en formato flotante.
  • prioridad: valor de prioridad, cuanto menor sea el número, mayor será la prioridad.
  • acción: función de tarea
  • argumento: tupla de parámetros,

Ejemplo completo

import sched, time 
from datetime import datetime, timedelta

s = sched.scheduler(time.time, time.sleep)

def print_time(a: str='default'):
    # task function example
    print("From print_time", datetime.now(), a)

def calc_gap_second(dt: datetime):
    # get gap btw current time and input datetime, unit is second
    return dt.timestamp() - datetime.now().timestamp()

def print_some_times():
    print(datetime.now())
    t1= time.time()
    s.enter(10,1, print_time)   # 10秒后执行,优先级为1
    # 5秒后执行,优先级为2, 输入参数("test-2, ) 
    s.enter(5, 2, print_time, argument=('test_2',))  
    # 也是5秒后执行,用kwargs方式输入参数
    s.enter(5, 2, print_time, kwargs={
    
    'a': 'test_3'})
    # 预定在某个时间点执行,计算与当前时间的时差
    dt1 = datetime.strptime("2023-08-15 16:25:00:000001", "%Y-%m-%d %H:%M:%S:%f")
    s1: float = calc_gap_second(dt1)
    print("s1:",s1)
    # 根据计算好的时差来添加任务。
    s.enter(s1, 1, print_time, kwargs={
    
    'a': 'test_4'})
    # 用enterabs()方法,以时间点来添加任务
    s.enterabs(t1+6,1, print_time, kwargs={
    
    'a': 'test_5'})
    s.run()   # 启动监视任务循环
    print(time.time)

print_some_times()

producción

2023-08-15 16:24:44.827923
s1: 15.162081003189087
From print_time 2023-08-15 16:24:49.830699 test_2
From print_time 2023-08-15 16:24:49.830699 test_3
From print_time 2023-08-15 16:24:50.833527 test_5
From print_time 2023-08-15 16:24:54.829681 default
From print_time 2023-08-15 16:25:00.005648 test_4

Gestión de colas de tareas

Ver todas las tareas
ejemplos de cola de tareas sched.queue

Cancelar tarea

sched.cancel(event) cancela una sola tarea.
El evento es el objeto de tarea devuelto después de que enter() y enterabs() agregan tareas.

e1 = scheduler.enter(1, 1, print_event,('1 st', ))

Determinar si la cola de tareas está vacía

shed.empty() comprueba si la cola está vacía y devuelve True si está vacía.

Ejemplo

import sched
import time

scheduler = sched.scheduler(time.time, time.sleep)
  
def print_event(name):
    print('EVENT:', time.time(), name)

print ('START:', time.time())
e1 = scheduler.enter(1, 1, print_event,('1 st', ))
e2 = scheduler.enter(2, 1, print_event,(' 2nd', ))
scheduler.cancel(e1)
print("schedule queue length:", len(s.queue))
scheduler.run()

producción:

START: 1580390119.54074
schedule queue length: 1
EVENT: 1580390121.5439944  2nd

Las bibliotecas avanzadas de gestión de tareas programadas, como APScheduler , pueden implementar una gestión de tareas programadas más compleja.

Supongo que te gusta

Origin blog.csdn.net/captain5339/article/details/132302634
Recomendado
Clasificación