2015-10-09 2 views
1

Ceci est mon codePython - Apscheduler ne pas arrêter un emploi, même après avoir utilisé « remove_job »

J'utilise le remove_job et les shutdown fonctions du planificateur d'arrêter un emploi, mais il continue à exécuter.

Quelle est la manière correcte d'empêcher une tâche d'être exécutée?

from apscheduler.schedulers.background import BlockingScheduler 

def job_function(): 
    print "job executing" 


scheduler = BlockingScheduler(standalone=True) 
scheduler.add_job(job_function, 'interval', seconds=1, id='my_job_id') 


scheduler.start() 
scheduler.remove_job('my_job_id') 
scheduler.shutdown() 

Répondre

4

Demandez simplement le planificateur pour enlever le travail à l'intérieur du job_function en utilisant le remove_function comme @Akshay Pratap Singh Pointu correctement, que le contrôle ne retourne jamais revenir à start()

from apscheduler.schedulers.background import BlockingScheduler 

count = 0 

def job_function(): 
    print "job executing" 
    global count, scheduler 

    # Execute the job till the count of 5 
    count = count + 1 
    if count == 5: 
     scheduler.remove_job('my_job_id') 


scheduler = BlockingScheduler() 
scheduler.add_job(job_function, 'interval', seconds=1, id='my_job_id') 


scheduler.start() 
5

Comme vous utilisez BlockingScheduler, vous devez d'abord savoir que c'est la nature.

Donc, en gros BlockingScheduler est un programmateur qui se déroule au premier plan (c.-à-start() va bloquer le programme) .En termes de laïcs, il court au premier plan, alors quand vous appelez start(), l'appel ne revient jamais. C'est pourquoi toutes les lignes qui sont suivies de start() ne sont jamais appelées, à cause de quoi votre planificateur ne s'est jamais arrêté.

BlockingScheduler peut être utile si vous souhaitez utiliser APScheduler comme programmateur autonome (par exemple pour construire un démon).


Solution

Si vous voulez arrêter votre planificateur après l'exécution de code, alors vous devriez opter pour d'autres types de planificateur énumérés dans ApSchedulerdocs.

Je recommande BackgroundScheduler, si vous voulez que le planificateur d'exécuter en arrière-plan dans votre application/programme que vous pouvez pause, CV et supprimer à tout moment, quand vous en avez besoin.

+0

Le code n'exécute pas un seul travail du tout, en utilisant BackgroundScheduler de cette façon -> http://pastebin.com/xDAJAXvT Que fais-je tort? – wolfgang

+0

Avec BackgroundScheduler, start() ne bloque pas votre script principal, ce qui stoppe efficacement votre application. Vous ne voulez sûrement pas arrêter le travail juste après le démarrage du planificateur, alors quel est le scénario du monde réel ici? –

+0

@ AlexGrönholm Je veux simplement planifier un travail en cours d'exécution à chaque intervalle, même si le script principal se termine. Je voudrais arrêter le travail éventuellement à l'intérieur de la fonction associée – wolfgang

0

Le planificateur doit être arrêté d'un autre fil. Le thread dans lequel scheduler.start() est appelé est bloqué par le planificateur. Les lignes que vous avez écrites après scheduler.start() sont des codes inaccessibles.

+0

s'il vous plaît clarifier quelle annonce de valeur supplémentaire donnée par ce poste des autres. – Raju