我有一个普通的 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()
最佳答案
在单线程模式下使用 Flask 的调试服务器无法做到这一点(您的示例代码使用的是这种模式)。这是因为默认情况下,Flask 调试服务器仅继承自 Python 的标准 HTTPServer
,它是单线程的。 (并且对 select.select()
的底层调用不返回时间戳。)
I just have one thread to process requests.
好的,但是产生多个线程就足够了吗,但阻止它们并行执行“实际”工作?如果是这样,您可以尝试 app.run(..., threaded=True)
,以允许请求立即启动(在它们自己的线程中)。在记录了 start
时间戳后,使用 threading.Lock
强制请求串行执行。
另一种选择是使用不同的 WSGI 服务器(不是 Flask 调试服务器)。我怀疑有一种方法可以使用 GUnicorn 实现您想要的,在单个线程中配置异步 worker 。
关于python - 如何在 flask 中获取请求的到达时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40402804/