自前でスケジューラっぽいものを書いてみた
cron風味。ってかそれならcronのソース読めという感じですが。
httpも絡むとちょっと面倒かなぁ。httpのみではないのでtornadoとかは使ってないんだけど、httpも使うしtwisted/tornadeみたいなフレームワークを検討すべきなんすかね?別に待ち受けるわけじゃないんだけど。
# thread-based Timer Object import threading import datetime import time class ThreadObject(threading.Thread): """ require execute function timespan: time which Object execute between starttime: time which Object start after endtime: time which Object end """ def __init__( self, timespan, starttime, endtime ): threading.Thread.__init__(self) self.timeSpan = timespan self.startTime = starttime self.endTime = endtime self.nextExecuteTime = datetime.datetime.now() + timespan self.calcNextTime() self.nextStartTime -= datetime.timedelta(days=1) self.nextEndTime -= datetime.timedelta(days=1) def run(self): print self.nextExecuteTime print self.nextEndTime while(1): t = datetime.datetime.now() if t > self.nextExecuteTime: flag = self.isExecutableTime() if( not(flag) ): self.nextExecuteTime = self.nextStartTime else: self.execute() self.nextExecuteTime += self.timeSpan print "nextExecuteTime", self.nextExecuteTime time.sleep(0.01) def execute(self): print ("error!") def isExecutableTime(self): print "calc ", print self.nextStartTime, print self.nextEndTime, if self.nextEndTime < self.nextExecuteTime: self.calcNextTime() # calc next start/end time if self.nextStartTime > self.nextExecuteTime: return False return True def calcNextTime(self): """ >>> import datetime >>> span = datetime.timedelta(hours=1) >>> startTime = datetime.timedelta(hours=5) >>> endTime = datetime.timedelta(hours=12) >>> to = ThreadObject(span,startTime,endTime) >>> to.calcNextTime() >>> print to.nextStartTime - datetime.datetime.now().replace(hour=0,minute=0,second=0,microsecond=0) - datetime.timedelta(days=1,hours=5) 0:00:00 >>> print to.nextEndTime - datetime.datetime.now().replace(hour=0,minute=0,second=0,microsecond=0) - datetime.timedelta(days=1,hours=12) 0:00:00 """ tommorow = datetime.datetime.now().replace(hour=0,minute=0,second=0,microsecond=0 ) + datetime.timedelta(days=1) self.nextStartTime = self.startTime + tommorow self.nextEndTime = self.endTime + tommorow def main(): span = datetime.timedelta(minutes=1) startTime = datetime.timedelta(hours=5) endTime = datetime.timedelta(hours=12) to = ThreadObject(span,startTime,endTime) to.start() if __name__ == "__main__": import doctest doctest.testmod() main()
この例だと5時から12時まで、1分置きにerror!と出力されるはず(現在テストしてる)