2016-11-03 45 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來實現你想要的,在單線程中用異步工作器進行配置。