有关python定时任务服务[win]

关于python实现定时任务调度服务,直接上源码:

# -*- coding:utf-8 -*-
import servicemanager
import sys
import time
import win32event
import win32service
import datetime
import win32serviceutil
import winerror

__authro__ = 'Bill'

import os
from apscheduler.schedulers.blocking import BlockingScheduler


def get_file_dir():
    return os.path.dirname(os.path.abspath(__file__)) + "\\"


exe_path = get_file_dir()


class Worker(object):

    @classmethod
    def DoPhpBatWorker(self):
        batDir = exe_path + "bat\\"
        batFile = 'loop.bat'
        os.system(batDir + batFile)

    @classmethod
    def DoVMWorker(self):
        batDir = exe_path + "bat\\"
        batFile = 'startVmware.bat'
        os.system(batDir + batFile)


class TickScheduler(object):

    def __init__(self):
        self.__blockingScheduler = BlockingScheduler()

    def __addTask(self):
        onceTime = (datetime.datetime.now() + datetime.timedelta(minutes=1)).strftime('%Y-%m-%d %H:%M:%S')
        self.__blockingScheduler.add_job(Worker.DoPhpBatWorker, 'interval', seconds=15) # 15秒一次
        self.__blockingScheduler.add_job(Worker.DoVMWorker, 'date', run_date=onceTime)  # 只执行一次

    def run(self):
        self.__addTask()
        try:
            self.__blockingScheduler.start()
        except (KeyboardInterrupt, SystemExit):
            self.__blockingScheduler.shutdown()

    def stop(self):
        self.__blockingScheduler.shutdown()


class AITickerTaskService(win32serviceutil.ServiceFramework):
    _svc_name_ = "AITickerTaskService"
    _svc_display_name_ = "AITickerTaskService"
    _svc_description_ = "Ticker服务组件"

    def __init__(self, args):
        win32serviceutil.ServiceFramework.__init__(self, args)
        self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
        self.__iniTask()

    def __iniTask(self):
        self.__tickScheduler = TickScheduler()

    def SvcDoRun(self):
        self.run = True
        self.__tickScheduler.run()
        while self.run:
            time.sleep(4)

    def SvcStop(self):
        self.run = False
        self.__tickScheduler.stop()
        time.sleep(4)
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        win32event.SetEvent(self.hWaitStop)


if __name__ == '__main__':
    if len(sys.argv) == 1:
        try:
            evtsrc_dll = os.path.abspath(servicemanager.__file__)
            servicemanager.PrepareToHostSingle(AITickerTaskService)
            servicemanager.Initialize('AITickerTaskService', evtsrc_dll)
            servicemanager.StartServiceCtrlDispatcher()
        except win32service.error as details:
            if details[0] == winerror.ERROR_FAILED_SERVICE_CONTROLLER_CONNECT:
                win32serviceutil.usage()
    else:
        import pickle

        modName = pickle.whichmodule(AITickerTaskService, AITickerTaskService.__name__)
        win32serviceutil.HandleCommandLine(AITickerTaskService)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值