# `sched` — Event scheduler

Código fuente: Lib/sched.py

El módulo `sched` define una clase que implementa un planificador de eventos de propósito general:

class sched.scheduler(timefunc=time.monotonic, delayfunc=time.sleep)

  La clase `scheduler` define una interfaz genérica para planificar eventos. Necesita dos funciones para tratar con el «mundo exterior» — timefunc debe poder llamarse sin argumentos y retornar un número (el «time», en cualquier unidad). La función delayfunc debería ser invocable con un argumento, compatible con la salida de timefunc, y debería retrasar tantas unidades de tiempo. delayfunc también se llamará con el argumento `0` después de que se ejecute cada evento para permitir que otros hilos tengan la oportunidad de ejecutarse en aplicaciones multihilo.

  Distinto en la versión 3.3: Los argumentos timefunc and delayfunc son opcionales.

  Distinto en la versión 3.3: `scheduler` La clase se puede usar de forma segura en entornos multihilo.

Ejemplo:

    >>> import sched, time
    >>> s = sched.scheduler(time.time, time.sleep)
    >>> def print_time(a='default'):
    ...     print("From print_time", time.time(), a)
    ...
    >>> def print_some_times():
    ...     print(time.time())
    ...     s.enter(10, 1, print_time)
    ...     s.enter(5, 2, print_time, argument=('positional',))
    ...     # despite having higher priority, 'keyword' runs after 'positional' as enter() is relative
    ...     s.enter(5, 1, print_time, kwargs={'a': 'keyword'})
    ...     s.enterabs(1_650_000_000, 10, print_time, argument=("first enterabs",))
    ...     s.enterabs(1_650_000_000, 5, print_time, argument=("second enterabs",))
    ...     s.run()
    ...     print(time.time())
    ...
    >>> print_some_times()
    1652342830.3640375
    From print_time 1652342830.3642538 second enterabs
    From print_time 1652342830.3643398 first enterabs
    From print_time 1652342835.3694863 positional
    From print_time 1652342835.3696074 keyword
    From print_time 1652342840.369612 default
    1652342840.3697174

## Objetos de `Scheduler`

`scheduler` Las sentencias tienen los siguientes métodos y atributos:

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

  Planifica un nuevo evento. El argumento time debe ser un tipo numérico compatible con el valor de retorno de la función timefunc que se pasa al constructor. Los eventos planificados para la misma time se ejecutarán en el orden de su priority. Un número más bajo representa una prioridad más alta.

  Ejecutar el evento significa ejecutar `action(*argument, **kwargs)`. argument es una secuencia que contiene los argumentos posicionales para action. kwargs es un diccionario que contiene los argumentos de palabras clave para action.

  El valor de retorno es un evento que puede usarse para una cancelación posterior del evento (ver `cancel()`).

  Distinto en la versión 3.3: El argumento argument es opcional.

  Distinto en la versión 3.3: Se agregó el argumento kwargs.

scheduler.enter(delay, priority, action, argument=(), kwargs={})

  Planifica un evento delay para más unidades de tiempo. Aparte del tiempo relativo, los otros argumentos, el efecto y el valor de retorno son los mismos que para `enterabs()`.

  Distinto en la versión 3.3: El argumento argument es opcional.

  Distinto en la versión 3.3: Se agregó el argumento kwargs.

scheduler.cancel(event)

  Elimina el evento de la cola. Si event no es un evento actualmente en la cola, este método lanzará un `ValueError`.

scheduler.empty()

  Retorna `True` si la cola de eventos está vacía.

scheduler.run(blocking=True)

  Ejecuta todos los eventos planificados. Este método esperará (usando la función delayfunc enviada al constructor) al próximo evento, luego lo ejecutará y así sucesivamente hasta que no haya más eventos planificados.

  Si blocking es falso, se ejecutan los eventos planificados que expiran mas pronto (si corresponde) y luego retorna la fecha límite de la próxima llamada programada en el planificador (si corresponde).

  action o delayfunc pueden generar una excepción. En cualquier caso, el planificador mantendrá un estado consistente y propagará la excepción. Si action genera una excepción, el evento no se intentará en futuras llamadas a `run()`.

  Si una secuencia de eventos tarda más en ejecutarse que el tiempo disponible antes del próximo evento, el planificador simplemente se retrasará. No se descartarán eventos; el código de llamada es responsable de cancelar eventos que ya no son oportunos.

  Distinto en la versión 3.3: Se agregó el argumento blocking.

scheduler.queue

  Atributo de solo lectura que retorna una lista de los próximos eventos en el orden en que se ejecutarán. Cada evento se muestra como un named tuple con los siguientes campos : time, priority, action, argument, kwargs.