簡體   English   中英

如何每晚重新運行我的python flask應用程序?

[英]How to re-run my python flask application every night?

我有一個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)

您可以使用Python Rq放入隊列系統。

您可以在app.py中生成一個線程,該線程調用/cache調用並休眠24小時。

您可以執行以下操作:

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()

我不確定這是否適合您的特定用例,但是您可以在給定的時間段內緩存該函數的結果:

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()將返回相同的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM