mirror of https://github.com/tp4a/teleport
add cron.
parent
ca7d6ad517
commit
145e3a0d5c
|
@ -0,0 +1,71 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
import datetime
|
||||
import time
|
||||
import threading
|
||||
|
||||
from app.base.logger import log
|
||||
|
||||
|
||||
class TPCron(threading.Thread):
|
||||
def __init__(self):
|
||||
super().__init__(name='tp-cron-thread')
|
||||
|
||||
import builtins
|
||||
if '__tp_cron__' in builtins.__dict__:
|
||||
raise RuntimeError('TPCron object exists, you can not create more than one instance.')
|
||||
|
||||
# job表,session_id为索引,每个项为一个字典,包括 f(要执行的回调函数), t(最后一次执行的时间), i(间隔时间)
|
||||
self._jobs = dict()
|
||||
|
||||
self._lock = threading.RLock()
|
||||
self._stop_flag = False
|
||||
|
||||
def init(self):
|
||||
return True
|
||||
|
||||
def add_job(self, name, func, first_interval_seconds=None, interval_seconds=60):
|
||||
# 加入一个待执行的任务, first_interval 为从加入开始算起到首次执行时的间隔时间,为None则立即执行
|
||||
# interval 为两次执行之间的间隔时间
|
||||
with self._lock:
|
||||
if name in self._jobs:
|
||||
return False
|
||||
self._jobs[name] = {'f': func, 't': 0, 'i': interval_seconds}
|
||||
_now = int(datetime.datetime.utcnow().timestamp())
|
||||
if first_interval_seconds is not None:
|
||||
self._jobs[name]['t'] = _now + first_interval_seconds - interval_seconds
|
||||
|
||||
def stop(self):
|
||||
self._stop_flag = True
|
||||
self.join()
|
||||
log.v('{} stopped.\n'.format(self.name))
|
||||
|
||||
def run(self):
|
||||
pass
|
||||
|
||||
while not self._stop_flag:
|
||||
time.sleep(1)
|
||||
|
||||
with self._lock:
|
||||
_now = int(datetime.datetime.utcnow().timestamp())
|
||||
for j in self._jobs:
|
||||
# log.v('--now: {}, job-name: {}, job-t: {}, job-i: {}\n'.format(_now, j, self._jobs[j]['t'], self._jobs[j]['i']))
|
||||
if _now - self._jobs[j]['t'] >= self._jobs[j]['i']:
|
||||
self._jobs[j]['t'] = _now
|
||||
try:
|
||||
self._jobs[j]['f']()
|
||||
except:
|
||||
log.e('got exception when exec job: {}\n'.format(j))
|
||||
|
||||
|
||||
def tp_corn():
|
||||
"""
|
||||
取得TPCron管理器的唯一实例
|
||||
|
||||
:rtype : TPCron
|
||||
"""
|
||||
|
||||
import builtins
|
||||
if '__tp_cron__' not in builtins.__dict__:
|
||||
builtins.__dict__['__tp_cron__'] = TPCron()
|
||||
return builtins.__dict__['__tp_cron__']
|
Loading…
Reference in New Issue