2015-09-09 2 views
1

Je tente d'exécuter plusieurs tâches AP Scheduler dans mon programme (intervalle et cron), mais lorsque j'ajoute plusieurs tâches d'intervalle avec des intervalles différents, elles s'exécutent toutes dans le plus court intervalle. Par exemple, j'ajoute un travail avec une fréquence de 30 secondes et un avec 15 secondes, les deux s'exécuteront toutes les 15 secondes.Comment exécuter des tâches AP Scheduler simultanées?

Mon code est ci-dessous. Comment puis-je correctement exécuter ces deux tâches sur des intervalles séparés?

from apscheduler.schedulers.background import BackgroundScheduler 
from apscheduler.executors.pool import ProcessPoolExecutor 

executors = { 
      'default': {'type': 'threadpool', 'max_workers': 20}, 
      'processpool': ProcessPoolExecutor(max_workers=5) 
      } 
job_defaults = { 
       'coalesce': False, 
       'max_instances': 3 
       } 
sched = BackgroundScheduler(executors=executors, job_defaults=job_defaults, timezone="EST") 

sched.start() 
sched.add_job(lambda: module.handle(self.profile, mic), 'interval', id=module.__name__, seconds=15) 
sched.add_job(lambda: module2.handle(self.profile, mic), 'interval', id=module2.__name__, seconds=30) 
atexit.register(lambda: sched.shutdown(wait=False)) 

Répondre

0

Vous ajoutez 2 emplois

sched.add_job(lambda: module.handle(self.profile, mic), 'interval', id=module.__name__, seconds=15) 
sched.add_job(lambda: module2.handle(self.profile, mic), 'interval', id=module.__name__, seconds=30) 

avec les ID de doublon id=module.__name__. Avez-vous besoin de spécifier des ID par vous-même? Apscheduler peut le faire pour vous.

+0

Désolé, c'était en fait une faute de frappe. J'ajoute le deuxième travail avec un ID de module2 .__ name__ – brad999

+0

J'avais ce problème avant que je commence à mettre manuellement l'identification dedans aussi bien. Je les ai ajoutés manuellement dans l'espoir de résoudre le problème. – brad999

0

Cela s'est avéré être un problème avec le lambda que j'utilisais. J'ai enlevé le lambda en ajoutant le paramètre args comme ci-dessous.

sched.add_job(module.handle, 'interval', args=[self.profile, mic], id=module.__name__, seconds=15) 
sched.add_job(module2.handle, 'interval', args=[self.profile, mic], id=module.__name__, seconds=30)