Как запустить bottle и параллельную функцию?

#python #bottle

#python #bottle

Вопрос:

У меня есть веб-сервер, который создает файл при вызове. Я хотел бы добавить куда-нибудь функцию, запускаемую одновременно, которая проверяла бы этот файл и воздействовала на его содержимое, но я не знаю, где разместить его в коде. Код для веб-сервера:

 import bottle
import pickle
import time

class WebServer(object):
    def __init__(self):
        bottle.route("/", 'GET', self.root)
        bottle.run(host='0.0.0.0', debug=True)

    def root(self):
        with open("watchdog.txt", "wb") as f:
            pickle.dump(time.time(), f)

if __name__ == "__main__":
    WebServer()
  

Функция, которую я хотел бы запустить вместе с веб-сервером:

 def check():
    with open("watchdog.txt", "rb") as f:
        t1 = pickle.load(f)
    t2 = time.time()
    if t2 - t1 > 10:
        print("stale watchdog")
  

Вызов WebServer() помещает программу в цикл (что нормально, веб-сервер прослушивает), поэтому я хотел бы поместить check() куда-нибудь, где это можно было бы объединить с обратным вызовом (аналогично self.root.after() в Tkinter). Как лучше всего это сделать?

ПРИМЕЧАНИЕ: я пропустил в приведенном выше коде проверку ошибок, учет отсутствия watchdog.txt и т. Д. для простоты.

Комментарии:

1. «запуск вместе» — пожалуйста, уточните. вы хотите периодически вызывать check ?

2. @KarolyHorvath: да, именно. Я хотел бы периодически вызывать check()

Ответ №1:

Одно из решений, которое я наконец нашел, — использовать планировщик событий:

 import bottle
import pickle
import time
import threading

class WebServer(object):
    def __init__(self):
        bottle.route("/", 'GET', self.root)
        bottle.run(host='0.0.0.0', debug=True)

    def root(self):
        with open("watchdog.txt", "wb") as f:
            pickle.dump(time.time(), f)


def check():
    try:
        with open("watchdog.txt", "rb") as f:
            t1 = pickle.load(f)
    except IOError:
        pass
    else:
        t2 = time.time()
        if t2 - t1 > 10:
            print("stale watchdog")
        else:
            print("fresh watchdog")
    finally:
        threading.Timer(10, check).start()


if __name__ == "__main__":
    check()
    WebServer()