我有一个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)
答案 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()
两次将返回相同的结果。