2015-05-07 5 views
0

У меня есть приложение python flask, в котором я кэширую некоторые данные в памяти при запуске app.py.Как перезапустить мое приложение для флиса python каждую ночь?

Там есть вызов функции, как это:

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

Если вы работаете в UNIX, подумайте о написании задания cron. – nneonneo

+0

В Windows я могу запланировать через планировщик задач Windows. Это остановит выполнение app.py, который уже запущен, прежде чем пытаться запустить его снова? – user3422637

+0

Нет, он должен создать совершенно новый процесс (экземпляр). Чтобы обобщить первый комментарий, это во многом зависит от того, где размещено ваше приложение, - другими словами, больше об ОС, а не в колбе как таковой. –

ответ

0

Вы можете создать нить в app.py, которая вызывает звонок /cache и спит в течение 24 часов.

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 часов, время выполнения будет задерживаться к моменту, когда потребуется выполнить его каждый раз.

Пример:

Run вещи каждый день на 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() 
+0

Можете ли вы, пожалуйста, изменить ответ с помощью образца значения datetime. Скажем, если бы нам пришлось запускать его в Current_date 1:00 PM – user3422637

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

Вызов f() дважды в одной и той же 2-секундного интервала будет возвращать один и тот же результат.

+0

Я не очень хорошо это понимаю. Это довольно сложно. Где теперь разместить приложение app.run()? Можете ли вы помочь мне изменить код, указанный в вопросе, для включения запланированных перезагрузок? – user3422637

+0

Ну, ваш пример кода * есть * просто 'app.run()'. Можете ли вы добавить больше подробностей к своему вопросу? – Blender

Смежные вопросы