tiempo - programar una tarea en python
ProgramaciĆ³n de Python Script para ejecutar cada hora con precisiĆ³n (6)
Antes de preguntar, Cron Jobs y el Programador de tareas serán mis últimas opciones, este script se usará en Windows y Linux y preferiría tener un método codificado para hacer esto que dejarlo al usuario final para que lo complete.
¿Hay una biblioteca para Python que pueda usar para programar tareas? Necesitaré ejecutar una función una vez por hora, sin embargo, con el tiempo si ejecuto un script una vez por hora y uso .sleep, "una vez por hora" se ejecutará en una parte diferente de la hora del día anterior debido a la demora inherente a la ejecución / ejecución de la secuencia de comandos y / o función.
¿Cuál es la mejor manera de programar una función para que se ejecute en una hora específica del día (más de una vez) sin usar un trabajo cron o programarlo con el Programador de tareas?
O si esto no es posible, me gustaría su aporte también.
El Programador AP se ajusta exactamente a mis necesidades.
Versión <3.0
import datetime
import time
from apscheduler.scheduler import Scheduler
# Start the scheduler
sched = Scheduler()
sched.daemonic = False
sched.start()
def job_function():
print("Hello World")
print(datetime.datetime.now())
time.sleep(20)
# Schedules job_function to be run once each minute
sched.add_cron_job(job_function, minute=''0-59'')
fuera:
>Hello World
>2014-03-28 09:44:00.016.492
>Hello World
>2014-03-28 09:45:00.0.14110
Versión> 3.0
(De la respuesta de Animesh Pandey a continuación)
from apscheduler.schedulers.blocking import BlockingScheduler
sched = BlockingScheduler()
@sched.scheduled_job(''interval'', seconds=10)
def timed_job():
print(''This job is run every 10 seconds.'')
@sched.scheduled_job(''cron'', day_of_week=''mon-fri'', hour=10)
def scheduled_job():
print(''This job is run every weekday at 10am.'')
sched.configure(options_from_ini_file)
sched.start()
En la versión publicada por sunshinekitty llamada "Versión <3.0", es posible que deba especificar apscheduler 2.1.2. Accidentalmente tuve la versión 3 en mi instalación 2.7, así que fui:
pip uninstall apscheduler
pip install apscheduler==2.1.2
Funcionó correctamente después de eso. Espero que ayude.
Para apscheduler
<3.0, consulte la respuesta de Unknown .
Para apscheduler
> 3.0
from apscheduler.schedulers.blocking import BlockingScheduler
sched = BlockingScheduler()
@sched.scheduled_job(''interval'', seconds=10)
def timed_job():
print(''This job is run every 10 seconds.'')
@sched.scheduled_job(''cron'', day_of_week=''mon-fri'', hour=10)
def scheduled_job():
print(''This job is run every weekday at 10am.'')
sched.configure(options_from_ini_file)
sched.start()
Actualizar:
documentation apscheduler
.
Esto para apscheduler-3.3.1
en Python 3.6.2
.
"""
Following configurations are set for the scheduler:
- a MongoDBJobStore named “mongo”
- an SQLAlchemyJobStore named “default” (using SQLite)
- a ThreadPoolExecutor named “default”, with a worker count of 20
- a ProcessPoolExecutor named “processpool”, with a worker count of 5
- UTC as the scheduler’s timezone
- coalescing turned off for new jobs by default
- a default maximum instance limit of 3 for new jobs
"""
from pytz import utc
from apscheduler.schedulers.blocking import BlockingScheduler
from apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStore
from apscheduler.executors.pool import ProcessPoolExecutor
"""
Method 1:
"""
jobstores = {
''mongo'': {''type'': ''mongodb''},
''default'': SQLAlchemyJobStore(url=''sqlite:///jobs.sqlite'')
}
executors = {
''default'': {''type'': ''threadpool'', ''max_workers'': 20},
''processpool'': ProcessPoolExecutor(max_workers=5)
}
job_defaults = {
''coalesce'': False,
''max_instances'': 3
}
"""
Method 2 (ini format):
"""
gconfig = {
''apscheduler.jobstores.mongo'': {
''type'': ''mongodb''
},
''apscheduler.jobstores.default'': {
''type'': ''sqlalchemy'',
''url'': ''sqlite:///jobs.sqlite''
},
''apscheduler.executors.default'': {
''class'': ''apscheduler.executors.pool:ThreadPoolExecutor'',
''max_workers'': ''20''
},
''apscheduler.executors.processpool'': {
''type'': ''processpool'',
''max_workers'': ''5''
},
''apscheduler.job_defaults.coalesce'': ''false'',
''apscheduler.job_defaults.max_instances'': ''3'',
''apscheduler.timezone'': ''UTC'',
}
sched_method1 = BlockingScheduler() # uses overrides from Method1
sched_method2 = BlockingScheduler() # uses same overrides from Method2 but in an ini format
@sched_method1.scheduled_job(''interval'', seconds=10)
def timed_job():
print(''This job is run every 10 seconds.'')
@sched_method2.scheduled_job(''cron'', day_of_week=''mon-fri'', hour=10)
def scheduled_job():
print(''This job is run every weekday at 10am.'')
sched_method1.configure(jobstores=jobstores, executors=executors, job_defaults=job_defaults, timezone=utc)
sched_method1.start()
sched_method2.configure(gconfig=gconfig)
sched_method2.start()
Para ejecutar algo cada 10 minutos después de la hora.
from datetime import datetime, timedelta
while 1:
print ''Run something..''
dt = datetime.now() + timedelta(hours=1)
dt = dt.replace(minute=10)
while datetime.now() < dt:
time.sleep(1)
Tal vez esto pueda ayudar: Programador avanzado de Python
Aquí hay un pequeño fragmento de código de su documentación:
from apscheduler.schedulers.blocking import BlockingScheduler
def some_job():
print "Decorated job"
scheduler = BlockingScheduler()
scheduler.add_job(some_job, ''interval'', hours=1)
scheduler.start()
Una opción es escribir un contenedor C / C ++ que ejecute el script python de forma regular. Su usuario final ejecutaría el ejecutable C / C ++, que seguiría ejecutándose en segundo plano, y ejecutaría periódicamente el script de python. Puede que esta no sea la mejor solución, y puede que no funcione si no conoces C / C ++ o si deseas conservar este 100% python. Pero parece ser el enfoque más fácil de usar, ya que las personas están acostumbradas a hacer clic en los archivos ejecutables. Todo esto supone que python está instalado en la computadora de su usuario final.
Otra opción es usar cron job / Task Scheduler pero ponerlo en el instalador como un script para que su usuario final no tenga que hacerlo.