Example #1
0
class Apscheduler(object):
    def __init__(self, scheduler):
        '''
		https://apscheduler.readthedocs.io/en/latest/userguide.html?highlight=add_job

		Parameters
		----------
		scheduler:
			[str] 调度器,根据开发需求选择相应的调度器
			'BlockingScheduler' 阻塞式调度器:
				适用于只跑调度器的程序
			'BackgroundScheduler' 后台调度器:
				适用于非阻塞的情况,调度器会在后台独立运行
			'AsyncIOScheduler' AsyncIO调度器:
				适用于应用使用AsnycIO的情况
			'GeventScheduler' Gevent调度器:
				适用于应用通过Gevent的情况
			'TornadoScheduler' Tornado调度器:
				适用于构建Tornado应用
			'TwistedScheduler' Twisted调度器:
				适用于构建Twisted应用
			'QtScheduler' Qt调度器:
				适用于构建Qt应用
		'''
        import logging
        logging.basicConfig()
        scheduler = str(scheduler).lower()
        if ('blocking' in scheduler):
            from apscheduler.schedulers.blocking import BlockingScheduler
            self.scheduler = BlockingScheduler()
        elif ('background' in scheduler):
            from apscheduler.schedulers.background import BackgroundScheduler
            self.scheduler = BackgroundScheduler()
        elif ('asyncio' in scheduler):
            from apscheduler.schedulers.asyncio import AsyncIOScheduler
            self.scheduler = AsyncIOScheduler()
        elif ('gevent' in scheduler):
            from apscheduler.schedulers.gevent import GeventScheduler
            self.scheduler = GeventScheduler()
        elif ('tornado' in scheduler):
            from apscheduler.schedulers.tornado import TornadoScheduler
            self.scheduler = TornadoScheduler()
        elif ('twisted' in scheduler):
            from apscheduler.schedulers.twisted import TwistedScheduler
            self.scheduler = TwistedScheduler()
        elif ('qt' in scheduler):
            from apscheduler.schedulers.qt import QtScheduler
            self.scheduler = QtScheduler()

    def Add(self,
            trigger,
            func,
            args=(),
            kwargs={},
            date=None,
            period=None,
            jobid=None,
            name=None,
            **add_kwargs):
        '''
		Parameters
		----------
		trigger:
			[str] 'cron': 某一定时时刻执行
			      'interval': 每隔多长时间执行
			      'date': 只有某一该执行一次(一次性任务)

		date:
			[str] 'year/month/day hour:minute:second week'
			week:
				(1) trigger='cron': week=星期几 [str]:
					'mon','tue','wed','thu','fri','sat','sun'
					(1.1) 每分钟的第5秒:date='// ::5'
					(1.2) 每小时的第5分钟:date='// :5:'
					(1.3) 每个星期五:date='// :: fri'
				(2) trigger='interval': week=每隔多少个星期[int]
			注意,data中最多只允许有2个空格,第1个空格是年月日与时分秒之间,第2个空格是时分秒与星期之间,其他地方的空格会造成时间解释错误,从而运行错误

		period:
			[str] period='start_date--end_date--timezone'
			start_date, end_date:
				[str] 'year/month/day'
			timezone:
				[str of int]
			(1) period='2019/5/21--2020/7/16--8'  => 开始日期2019/5/21,结束日期2020/7/16,时区8
			(2) period='2019/5/21--//--8'  => 开始日期2019/5/21,没有结束日期,时区8
			(3) period='//--2020/7/16--8'  => 没有开始日期,结束日期2020/7/16,时区8
			(4) period='2019/5/21--2020/7/16--'  => 开始日期2019/5/21,结束日期2020/7/16,local电脑系统默认时区
		'''
        import numpy as np

        def toint(x):
            for i in range(len(x)):
                try:
                    x[i] = int(x[i])
                except:
                    pass
            return x

        date = date.split(' ')
        year, month, day = toint(date[0].split('/'))
        hour, minute, second = toint(date[1].split(':'))
        week = '' if (len(date) == 2) else date[2]
        date_kwargs = {}
        #----------------------------------------
        if (trigger == 'cron'):
            if (year != ''): date_kwargs['year'] = year
            if (month != ''): date_kwargs['month'] = month
            if (day != ''): date_kwargs['day'] = day
            if (hour != ''): date_kwargs['hour'] = hour
            if (minute != ''): date_kwargs['minute'] = minute
            if (second != ''): date_kwargs['second'] = second
            if (week != ''): date_kwargs['day_of_week'] = week
        #----------------------------------------
        elif (trigger == 'interval'):
            if (week != ''): date_kwargs['weeks'] = int(week)
            if (day != ''): date_kwargs['days'] = day
            if (hour != ''): date_kwargs['hours'] = hour
            if (minute != ''): date_kwargs['minutes'] = minute
            if (second != ''): date_kwargs['seconds'] = second
        #----------------------------------------
        elif (trigger == 'date'):
            run_date = '%i-%i-%i %i:%i:%i' % (year, month, day, hour, minute,
                                              second)
            date_kwargs['run_date'] = run_date
        #----------------------------------------
        if (period is not None):
            period = period.split('--')
            if (period[0] != '//'):
                date_kwargs['start_date'] = '%s-%s-%s' % tuple(
                    period[0].split('/'))
            if (period[1] != '//'):
                date_kwargs['end_date'] = '%s-%s-%s' % tuple(
                    period[1].split('/'))
            if (len(period) == 3): date_kwargs['timezone'] = period[2]
        #----------------------------------------
        add_kwargs.update(date_kwargs)
        self.scheduler.add_job(func=func,
                               trigger=trigger,
                               args=args,
                               kwargs=kwargs,
                               id=jobid,
                               name=name,
                               **add_kwargs)

    def Get(self, jobid):
        '''
		Parameters
		----------
		jobid:
			(1) =None: return all jobs in a list
			(2) =[str]: return this job
		'''
        if (jobid is None): return self.scheduler.get_jobs()
        else: return self.scheduler.get_job(jobid)

    def Remove(self, jobid):
        '''
		'''
        if (jobid is None): self.scheduler.remove()
        else: self.scheduler.remove_job(jobid)

    def Pause(self, jobid):
        '''
		'''
        if (jobid is None): self.scheduler.pause()
        else: self.scheduler.pause_job(jobid)

    def Resume(self, jobid):
        '''
		'''
        if (jobid is None): self.scheduler.resume()
        else: self.scheduler.resume_job(jobid)

    def Start(self, *args, **kwargs):
        '''
		'''
        self.scheduler.start(*args, **kwargs)

    def Shutdown(self, *args, **kwargs):
        '''
		'''
        self.scheduler.shutdown(*args, **kwargs)