Comment est-ce que je lance APScheduler dans un service Windows … J’y suis presque

Je travaille sur un projet pour exécuter Python APScheduler en tant que service Windows avec les résultats allant dans un fichier texte. Je peux installer et démarrer le service sans problème.

J’ai essayé plusieurs manières d’exécuter le planificateur dans un service avec le résultat le plus courant et le plus frustrant, à savoir que lorsque j’arrête le service, le thread du planificateur continue à écrire dans le fichier texte. Je dois redémarrer l’ordinateur pour tuer le thread.

J’ai essayé des ordonnanceurs ‘bloquants’ et ‘d’arrière-plan’ et ils se comportent de la même manière.

J’ai joué avec le déplacement du scheduler.shutdown () à différents endroits. Je voudrais le placer dans la fonction d’arrêt du service et faire en sorte que le planificateur fonctionne jusqu’à ce que le service reçoive une commande d’arrêt, à la suite de quoi la fonction d’arrêt du service se chargera de fermer le planificateur.

Peut-être que vous pouvez me diriger dans la bonne direction? Voici le code désinfecté pour vous assurer de ne pas avoir à redémarrer votre ordinateur.

import win32serviceutil import win32service import win32event import servicemanager import socket import time import logging import configparser import os from datetime import datetime from mysql.connector import errorcode from apscheduler.schedulers.background import BackgroundScheduler global FILEPATH global SERVICE #Define constants FILEPATH = os.path.dirname(os.path.realpath(__file__)) SERVICE = 'service.log' logging.basicConfig( filename = '%s\\%s' % (FILEPATH, SERVICE), level = logging.DEBUG, format = '[Logging Service] %(levelname)-7.7s %(message)s' ) def hi(text): logging.info(text) return class HelloWorldSvc (win32serviceutil.ServiceFramework): _svc_name_ = "Logging-Service" _svc_display_name_ = "Logging Service" _svc_description_ = "Periodically logs information" def __init__(self,args): win32serviceutil.ServiceFramework.__init__(self,args) self.stop_event = win32event.CreateEvent(None,0,0,None) socket.setdefaulttimeout(60) self.stop_requested = False def SvcStop(self): self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) win32event.SetEvent(self.stop_event) logging.info('Stopping service ...') self.stop_requested = True def SvcDoRun(self): servicemanager.LogMsg( servicemanager.EVENTLOG_INFORMATION_TYPE, servicemanager.PYS_SERVICE_STARTED, (self._svc_name_,'') ) self.main() def main(self): logging.info(' ** Starting Logging Operation ** ') scheduler = BackgroundScheduler() scheduler.add_job(hi, 'interval', seconds=5, args=['arg text']) scheduler.start() time.sleep(15) scheduler.shutdown() time.sleep(10) logging.info('Ended') return if __name__ == '__main__': win32serviceutil.HandleCommandLine(HelloWorldSvc) 

Avez-vous essayé de l’arrêter comme ceci:

  win32serviceutil.StopService(service, machine)