加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

如何在Windows服务中运行APScheduler …我几乎就在那里

发布时间:2020-12-14 02:46:50 所属栏目:Windows 来源:网络整理
导读:我正在开发一个项目,将 Python APScheduler作为Windows服务运行,结果将转换为文本文件.我可以毫不费力地安装和启动服务. 我尝试了几种在服务中运行调度程序的方法,最常见且令人沮丧的结果是,当我停止服务时,调度程序的线程继续写入文本文件.我必须重新启动计
我正在开发一个项目,将 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,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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读