2017-02-08 2 views
2

J'essaie de contribuer à un projet Python sur Github pour collecter des données de FXCM et j'ai quelques problèmes avec APScheduler dans une classe.APScheduler dans un objet Class

Voici une coupure de code.

# director.py 

from apscheduler.scheduler import Scheduler 

class Director(object): 
    """ 
    Description 
    """ 


class TimeKeeper(Director): 
    """ 
    Description 
    """ 
    def __init__(self): 
     sched = Scheduler() 


    def min_1(self): 
     td = 300 
     tf = 'm1' 
     print("TimeDelta: %s --- Time Frame: %s --- Event: 'GetLive' sent to queue") % (td, tf) 


    # other functions at different times 

    def start_timers(self): 
     self.sched.start() 
     self.sched.add_cron_job(self.min_1, minute='0-59') 

La classe commence avec un autre script ci-dessous:

# main.py 
from director import TimeKeeper 

if __name__ == "__main__": 
    """ 
    Description 
    """ 
    TimeKeeper().start_timers() 

Le problème est, une fois que le script est exécuté, il court pour une fraction de seconde puis arrête, il n'y a aucune erreur de retraçage.

La classe est-elle mal conçue ou est-ce que certaines parties du code me manquent? L'aide des Communautés serait grandement appréciée!

+0

Peut-être que vous utilisez une ancienne version de APScheduler, mais l'importation ne fonctionne pas pour 'Scheduler'. Cela dit, il existe plusieurs variantes du planificateur. Vous voulez probablement un 'BackgroundScheduler', à moins que votre code ne puisse s'asseoir et se bloquer après' .start() '. Dans ce cas, je commencerais probablement le planificateur dans son propre thread ou processus. – JoshAdel

+0

Merci pour votre réponse, j'utilise APScheduler 2.1.2. – James

+0

@JoshAdel Je l'ai juste essayé avec la version 3.x plus récente 'apscheduler.scheduler import Scheduler' à' from apscheduler.schedulers.background import BackgroundScheduler' et 'sched = Scheduler()' à 'sched = BackgroundScheduler()' J'obtiens le même résultat. – James

Répondre

1

La réponse formelle à votre problème est que lorsque vous utilisez APScheduler v2, le comportement par défaut du planificateur est de fonctionner en mode fileté, qui retournera immédiatement après avoir appliqué le .start():

https://github.com/agronholm/apscheduler/blob/2.1/apscheduler/scheduler.py#L90-L91

Depuis il revient immédiatement et rien ne maintient le fil principal de votre programme en vie, votre programme se termine immédiatement. Vous devez garder votre programmation suffisamment longtemps pour que le planificateur puisse déclencher un événement, ou vous devez exécuter une version bloquante du planificateur.

Pour cette ancienne version de APscheduler, vous devez exécuter en mode autonome si vous voulez que le planificateur pour bloquer:

https://github.com/agronholm/apscheduler/blob/2.1/examples/interval.py

ou si vous voulez continuer à fonctionner en mode arborescent:

https://github.com/agronholm/apscheduler/blob/2.1/examples/threaded.py

Les versions plus récentes de APScheduler ont des classes BlockingScheduler and BackgroundScheduler` distinctes et vous devez consulter les exemples appropriés pour l'API mise à jour.

+0

Merci pour votre explication détaillée, cela m'a certainement mis sur la bonne voie. – James