使用Tornado時,我有一個Get請求需要很長時間,因爲它向另一個Web服務發出許多請求並處理數據,可能需要幾分鐘才能完全完成。我不希望這阻止整個Web服務器響應其它請求,它目前所做的。龍捲風阻止異步請求
據我所知,Tornado是單線程的並且同步執行每個請求,即使它異步處理它們(仍然困惑在那個位上)。有很長一段時間的流程可能會暫停點以允許服務器處理其他請求(可能的解決方案?)。我在Heroku上使用單個工作人員來運行它,所以不知道如何轉化爲產生新的線程或多處理,我沒有使用python的經驗。
下面是我正在做的事情:客戶端使get調用來啓動進程,然後我每隔5秒循環一次get call來檢查狀態並用新信息更新頁面(長輪詢會也工作,但遇到同樣的問題)。問題在於,開始漫長的過程會阻止所有新的獲取請求(或新的長輪詢會話),直到完成。
有沒有簡單的方法來啓動這個長時間的調用,並沒有阻止整個Web服務器的過程?有什麼我可以放在代碼說..「暫停,處理待處理的請求,然後繼續」?
我需要在ProcessHandler上發起獲取請求。然後我需要在ProcessHandler正在運行時繼續查詢StatusHandler。
例子:
class StatusHandler(tornado.web.RequestHandler):
@tornado.web.asynchronous
def get(self):
self.render("status.html")
class ProcessHandler(tornado.web.RequestHandler):
@tornado.web.asynchronous
def get(self):
self.updateStatus("0")
result1 = self.function1()
self.updateStatus("1")
result2 = self.function2(result1)
self.updateStatus("2")
result3 = self.function3(result2)
self.updateStatus("3")
self.finish()
您是否嘗試過tornado.gen模塊? http://www.tornadoweb.org/documentation/gen.html –
你記得把它註釋爲一個異步調用:在你的GET方法上加上@asynchronous –
andyboot是的,我在我的GET方法上有@asynchronous – JeffG