2016-11-03 1 views
3

Простое серверное приложение. Я могу получить, сколько времени потребуется для обработки запроса. Но у меня есть только один поток для обработки запросов. В то же время поступает много запросов. Они будут стоять в очереди, чтобы дождаться обработки. Как я могу получить время ожидания в очереди каждого запроса?Как получить полученную временную метку запроса в колбе

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.rout('/', methods=['POST']) 
def serve_run(): 
    pass 
    …… 

if __name__ == '__main__': 
    app.debug = True 
    app.run('0.0.0.0', 6000) 
+0

Программисты часто используют gunicorn в качестве WSGI-сервера для фляжки, так как я могу получить полученную временную метку запроса – wyaibyn

+0

Это плохо сформулированный вопрос. В следующий раз вы должны описать проблему, возникшую с вашим кодом, перед тем, как вставить код. Кроме того, убедитесь, что код работает, если кто-то его запускал (я смотрю на '@ app.rout (...)'). – Dagrooms

+0

Я просто искал ответ на этот точный вопрос. Насколько я могу судить, вопрос точно сформулирован. –

ответ

0

Невозможно сделать это с помощью сервера отладки Flask в однопоточном режиме (что и используется в вашем примере кода). Это потому, что по умолчанию сервер отладки Flask просто наследует от стандарта Python HTTPServer, который является однопоточным. (И основной вызов select.select() не возвращает отметку времени.)

У меня только один поток для обработки запросов.

ОК, но достаточно ли генерировать несколько потоков, но мешать им выполнять «настоящую» работу параллельно? Если это так, вы можете попробовать app.run(..., threaded=True), чтобы разрешить запуск сразу же (в собственном потоке). После записи метки времени start используйте threading.Lock, чтобы заставить запросы выполнять серийно.

Другой вариант - использовать другой сервер WSGI (не сервер отладки Flask). Я подозреваю, что есть способ достичь того, что вы хотите, используя GUnicorn, настроенный с асинхронными рабочими в одном потоке.