微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何停止 Windows 服务中的调度程序?

如何解决如何停止 Windows 服务中的调度程序?

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

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

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

也许你能指出我正确的方向?以下是经过清理的代码,以确保您无需重新启动计算机。

import socket
import win32serviceutil
import servicemanager
import win32event
import win32service
from apscheduler.schedulers.blocking import BlockingScheduler
from ApiLoop import ApiPostLoop
from communicate import Connect_device

class SMWinservice(win32serviceutil.ServiceFramework):
_svc_name_ = "EnvisoftFS"
_svc_display_name_ = "EnvisoftFS"
_svc_description_ = "envisoft.com.tr | 2021 All rights reserved."

@classmethod
def parse_command_line(cls):
    win32serviceutil.HandleCommandLine(cls)

def __init__(self,args):

    win32serviceutil.ServiceFramework.__init__(self,args)
    self.hWaitStop = win32event.CreateEvent(None,None)
    socket.setdefaulttimeout(60)
    self.Api = ApiPostLoop()
    self.scheduler = BlockingScheduler()

def SvcStop(self):
    self.stop()
    self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
    win32event.SetEvent(self.hWaitStop)

def SvcDoRun(self):
    self.start()
    self.Api.SendDiagnostic("İstasyon Çevrimiçi")
    self.Api.SendDiagnosticWithType("1") #İstasyon Çevrimiçi
    try:
        self.Api.GetChannelinformationByStationId()
    except:pass

    servicemanager.LogMsg(servicemanager.EVENTLOG_informatION_TYPE,servicemanager.PYS_SERVICE_STARTED,(self._svc_name_,''))

    self.scheduler.add_job(func=self.ConnectDevices,trigger='cron',second='30,59')
    self.scheduler.add_job(func=self.ChangeSystemTime,hour='*/3',minute='1',second='20')
    self.scheduler.add_job(func=self.ChangeSaisinformation,hour='23',minute='59',second='20')
    self.scheduler.add_job(func=self.ChangeChannelinformation,minute='*/59',second='20')

    self.Api.SendDiagnosticWithType("5")  # Veri Gönderiyor.
    self.main()

def start(self):
    self.isrunning = True

def stop(self):
    self.isrunning = False

def ConnectDevices(self):

    try:
        Connect_device()
    except:pass

def ChangeSystemTime(self):
    #Her 3 saatte bir değişecek !
    try:
        self.Api.GetServerDateTime()
    except:pass

def ChangeSaisinformation(self):
    #Günde 1 defa
    try:
        self.Api.GetStationinformation()
    except:pass

def ChangeChannelinformation(self):
    #Her saat başı
    try:
        self.Api.GetChannelinformationByStationId()
    except:pass

def SendData(self):
    #Her 15 dakikada bir
    try:
        self.Api.SendData()
    except:pass


def main(self):
    self.scheduler.start()


if __name__ == '__main__':
    SMWinservice.parse_command_line()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。