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

时间:2016-11-03 13:31:10

标签: http flask timestamp

简单的服务器应用程序。我可以花多少时间来处理请求。但我只有一个线程来处理请求。有许多请求同时到达。他们排队等待处理。如何获得每个请求的队列中的等待时间?

from flask import Flask, request, g
import time

app = Flask(__name__,instance_relative_config=True)

@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('0.0.0.0', 6000)

2 个答案:

答案 0 :(得分:0)

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

  

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

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

另一种选择是使用不同的WSGI服务器(而不是Flask调试服务器)。我怀疑有一种方法可以使用GUnicorn实现你想要的东西,在一个线程中配置了异步工作者。

答案 1 :(得分:0)

你可以这样做

from flask import Flask, current_app, jsonify
import time

app = Flask(__name__)


@app.before_request
def before_request():
    Flask.custom_profiler = {"start": time.time()}


@app.after_request
def after_request(response):
    current_app.custom_profiler["end"] = time.time()
    print(current_app.custom_profiler)
    print(f"""execution time: {current_app.custom_profiler["end"] - current_app.custom_profiler["start"]}""")
    return response


@app.route('/', methods=['GET'])
def main():
    return jsonify({
        "message": "Hello world"
    })


if __name__ == '__main__':
    app.run()

像这样测试

→ curl http://localhost:5000
{"message":"Hello world"}

烧瓶消息

→ python main.py            
 * Serving Flask app "main" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
{'start': 1622960256.215391, 'end': 1622960256.215549}
execution time: 0.00015807151794433594
127.0.0.1 - - [06/Jun/2021 13:17:36] "GET / HTTP/1.1" 200 -