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