如何在flask中获取请求的到达时间戳

wya*_*byn 5 python timestamp http flask

我有一个普通的 Flask 应用程序,只有一个线程来处理请求。有许多请求同时到达。他们排队等待处理。如何获得每个请求的队列等待时间?

from flask import Flask, g
import time

app = Flask(__name__)

@app.before_request()
def before_request():
    g.start = time.time()
    g.end = None

@app.teardown_request
def teardown_request(exc):
    g.end = time.time()
    print g.end - g.start

@app.route('/', methods=['POST'])
def serve_run():
    pass

if __name__ == '__main__':
    app.debug = True
    app.run()
Run Code Online (Sandbox Code Playgroud)

Stu*_*erg 1

在单线程模式下使用 Flask 的调试服务器(这是您的示例代码所使用的)是无法做到这一点的。这是因为默认情况下,Flask 调试服务器仅继承自 Python 的标准HTTPServer单线程标准。(并且底层调用select.select()不会返回时间戳。)

我只有一个线程来处理请求。

好的,但是生成多个线程就足够了,但阻止它们并行执行“真正的”工作吗?如果是这样,您可以尝试app.run(..., threaded=True)允许请求立即启动(在它们自己的线程中)。之后start记录时间戳threading.Lock,使用 a强制请求串行执行。

另一种选择是使用不同的 WSGI 服务器(不是 Flask 调试服务器)。我怀疑有一种方法可以使用 GUnicorn 来实现您想要的效果,并在单个线程中配置异步工作线程。