在Flask app

时间:2017-05-24 10:47:44

标签: python flask

我有一个简单的烧瓶应用程序,当没有请求传入时,我需要连续打印“没有传入请求”到特定路径。任何人都可以帮我解决一下

1 个答案:

答案 0 :(得分:2)

你想要实现的有趣的事情:)。这是我放在一起的工作脚本。肯定有修改可以将它弯曲到你正在寻找的东西,但总体方案对我来说似乎很合理。

from flask import Flask
import threading
import time

app = Flask(__name__)


class Printer(object):

    def __init__(self, time_to_sleep):
        self.lock = threading.Lock()
        self.tts = time_to_sleep
        self.go_on = True

    def do_print(self):
        print "{}: no incoming requests".format(time.time())

    def loop(self):
        while self.go_on:
            time.sleep(self.tts)
            with self.lock:
                self.do_print()

    def exit(self):
        self.go_on = False


printer = Printer(1)


def lock_acquire(func):
    def __inner__(*args):
        with printer.lock:
            res = func(*args)
        return res
    return __inner__


@app.route('/')
@lock_acquire
def hello_world():
    time.sleep(5)
    return 'Hello, World!'


def run_app():
    host = "localhost"
    app.run(host=host, debug=1, use_reloader=False)


if __name__ == "__main__":
    t = threading.Thread(target=printer.loop,
                     name="looper")
    t.start()
    run_app()
    printer.exit()

所以你有一个线程定期获取一个锁并打印一条消息。路径api端点包含在首先获取此锁定(防止打印线程打印)的函数中,并在完成后释放它。另一个重要的事情是在循环中添加一个控制流变量(go_on),以便在退出时使用Ctrl-C保持线程不活动。否则脚本会挂起,因为该线程不是守护程序线程,因此会使进程保持活动状态。