如何每晚重新运行我的python烧瓶应用程序?

时间:2015-05-07 19:11:21

标签: python flask

我有一个python flask应用程序,当app.py运行时,我会在内存中缓存一些数据。

这样的函数调用:

cache_data()

我希望这个功能每晚都运行一次。有没有办法我可以安排脚本自己重新运行,或只是在current_date的日期发生变化时调用的函数?

if __name__ == "__main__":
    port = 80
    os.system("open http://localhost:{0}".format(port))

    app.debug = True # Turn False later
    app.run(host='0.0.0.0', port=port)

4 个答案:

答案 0 :(得分:0)

您可以将队列系统放入Python Rq

答案 1 :(得分:0)

您可以在app.py中生成一个调用/cache来电并停留24小时的线程。

答案 2 :(得分:0)

你可以这样做:

if __name__ == "__main__":

    when_to_run = # Set first run datetime
    time_to_wait = when_to_run - datetime.now()

    while True:
        time.sleep(time_to_wait.seconds)
        # run your stuff here

        when_to_run = # Set next run datetime
        time_to_wait = when_to_run - datetime.now()

假设您希望每天早上10点运行,您将when_to_run设置为今天上午10点,或者如果已经过去,明天早上10点,并在循环中添加timedelta。如果您只是设置为24小时休眠,则执行时间将延迟每次执行时间。

示例:

每天下午1点运行东西:

if __name__ == "__main__":

    when_to_run = datetime.now().replace(hour=13, minute=0, second=0, microsecond=0)
    if datetime.now() > when_to_run:
        # First run is tomorrow
        when_to_run += timedelta(days=1)
    time_to_wait = when_to_run - datetime.now()

    while True:
        time.sleep(time_to_wait.seconds)

        # run your stuff here
        stuff.run()

        when_to_run += timedelta(days=1)
        time_to_wait = when_to_run - datetime.now()

答案 3 :(得分:0)

我不确定这对于您的特定用例是否正确,但您可以在给定的时间段内缓存该函数的结果:

import functools
from datetime import datetime, timedelta

def cache(delta):
    if not hasattr(cache, 'results'):
        cache.results = {}
        cache.timeout = {}

    def decorator(function):
        @functools.wraps(function)
        def inner(*args, **kwargs):
            key = repr((function, args, kwargs))

            if key not in cache.results or cache.timeout[key] <= datetime.now():
                cache.results[key] = function(*args, **kwargs)
                cache.timeout[key] = datetime.now() + delta

            return cache.results[key]

        return inner

    return decorator

@cache(timedelta(seconds=2))
def f():
    return datetime.now()

在相同的2秒间隔内调用f()两次将返回相同的结果。