White scenery @showyou, hatena

If you have any comments, you may also send twitter @shsub or @showyou.

自前でスケジューラっぽいものを書いてみた

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!と出力されるはず(現在テストしてる)