gpt4 book ai didi

windows - 如何在 Windows 服务中运行 APScheduler ...我快到了

转载 作者:可可西里 更新时间:2023-11-01 13:46:46 27 4
gpt4 key购买 nike

我正在开发一个将 Python APScheduler 作为 Windows 服务运行的项目,并将结果保存到一个文本文件中。我可以顺利安装和启动该服务。

我已经尝试了几种在服务中运行调度程序的方法,最常见和令人沮丧的结果是当我停止服务时,调度程序的线程继续写入文本文件。我必须重新启动计算机才能终止线程。

我尝试了“阻塞”和“后台”调度程序,它们的行为相同。

我试过将 scheduler.shutdown() 移到不同的地方。我想将它放在服务停止函数中并让调度程序运行,直到服务收到停止命令,然后服务停止函数将处理关闭调度程序。

也许你能给我指明正确的方向?这是经过清理的代码,以确保您不必重新启动计算机。

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)

最佳答案

你试过这样停止它吗:

    win32serviceutil.StopService(service, machine)

关于windows - 如何在 Windows 服务中运行 APScheduler ...我快到了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27351859/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com