本人在做项目的时候遇到一个问题:

某个函数需要在每个小时的 3 分钟时候被执行一次,我希望我 15:45 启动程序,过了18 分钟在 16:03 这个函数被执行一次,下一次过 60 分钟在 17:03 再次被执行,下一次 18:03,以此类推。
以下是我基于 Timer 做的再封装实现了此功能。
# -*- coding: utf-8 -*-
# ==================================================
# 对 Timer 做以下再封装的目的是:当某个功能需要每隔一段时间被
# 执行一次的时候,不需要在回调函数里对 Timer 做重新安装启动
# ==================================================
__author__ = 'liujiaxing'
from threading import Timer
from datetime import datetime
class MyTimer( object ):
def __init__( self, start_time, interval, callback_proc, args=None, kwargs=None ):
self.__timer = None
self.__start_time = start_time
self.__interval = interval
self.__callback_pro = callback_proc
self.__args = args if args is not None else []
self.__kwargs = kwargs if kwargs is not None else {}
def exec_callback( self, args=None, kwargs=None ):
self.__callback_pro( *self.__args, **self.__kwargs )
self.__timer = Timer( self.__interval, self.exec_callback )
self.__timer.start()
def start( self ):
interval = self.__interval - ( datetime.now().timestamp() - self.__start_time.timestamp() )
print( interval )
self.__timer = Timer( interval, self.exec_callback )
self.__timer.start()
def cancel( self ):
self.__timer.cancel()
self.__timer = None
class AA:
def hello( self, name, age ):
print( "[%s]\thello %s: %d\n" % ( datetime.now().strftime("%Y%m%d %H:%M:%S"), name, age ) )
if __name__ == "__main__":
aa = AA()
start = datetime.now().replace( minute=3, second=0, microsecond=0 )
tmr = MyTimer( start, 60*60, aa.hello, [ "owenliu", 18 ] )
tmr.start()
tmr.cancel()
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。