2012-06-22 102 views
24

我正在尋找一個簡單的(即,不需要我設置單獨的服務器來處理消息隊列)的方式來進行長輪詢一個運行計算並生成圖形的小型web界面。這是我的web界面需要做什麼:Python中的非消息隊列/簡單的長輪詢(和Flask)

  1. 用戶在Web界面
  2. 服務器運行一些計算請求圖/數據。
  3. 當服務器正在運行計算時,一個小容器會更新(可能通過AJAX/jQuery)並計算進度(類似於您在打印控制檯中執行的操作(即打印'計算密度函數...' ))
  4. 計算完成和圖形顯示給用戶。

由於計算全部完成服務器端,我真的不知道如何輕鬆地設置此。很明顯,我將要設置一個REST API來處理輪詢,這在Flask中很容易。但是,我不確定如何檢索實際更新。一個明顯的,儘管這個目的很複雜,解決方案將是建立一個消息隊列並進行一些長的輪詢。但是,我不確定這是否是這種簡單的正確方法。

這裏是我的問題:

  1. 有沒有辦法做到這一點使用的文件系統?性能不是一個大問題。 AJAX/jQuery能從文件中找到消息嗎?保存進度到一些.json文件?
  2. 怎麼樣酸洗? (我對酸洗不是很瞭解,但也許我可以醃製一個消息字典,它可以通過處理輪詢的API讀取)。
  3. 投票甚至是正確的方法?有沒有更好或更普遍的模式來處理這個問題?

我有一種感覺,我太過於複雜,因爲我知道這種事情在網絡上很常見。很多時候,我發現有些事情正在發生,有些「loading.gif」圖片正在運行,而有些計算正在進行(例如,在Google Analytics中)。

感謝您的幫助!

回答

39

我已經使用Flask和jQuery構建了幾個這樣的應用程序。根據這個經驗,我會說你的計劃是好的。

  1. 請勿使用文件系統。您將遇到JavaScript安全問題/保護。在不太可能發生的情況下,您會找到合理的解決方法,但您仍然不會有任何便攜式或可擴展的問題。相反,使用像Flask這樣的小型本地Web服務框架。

  2. 不要泡菜。使用JSON。它是Web應用程序和REST界面的語言。 jQuery和那些用於繪製圖表,圖形等的基於jQuery的好插件都需要JSON。它易於使用,易於閱讀,而且對於小型應用程序,沒有理由去其他任何地方。

  3. 長輪詢對您想要完成的事情很好。純基於HTTP的應用程序有一些限制。 WebSockets和類似Socket.IO的socket-ish層是未來。「但根據我的經驗,尋找服務器端實現的優秀簡單例子已經很困難。我看起來很難。有很多例子需要你設置Node.js,REDIS和其他中間件。但爲什麼我們必須建立兩個或三個獨立的中間件服務器?這很可笑。因此,長時間輪詢一個像Flask這樣簡單的純Python網絡框架就是走向IMO的方法。

的代碼比片段多一點,因此而不是在這裏,包括它,我已經把一個簡單的例子爲a Mercurial repository on bitbucket,您可以自由查看,複製或克隆。有三個部分:

  • serve.py一個基於Python /瓶服務器
  • templates/index.html 98%的HTML,2%的模板文件基於瓶服務器將呈現爲HTML
  • static/lpoll.js一個基於jQuery的客戶端
+2

啊,非常感謝你*這麼多!我今晚會看看你的代碼。 「但根據我的經驗,找到服務器端實施的優秀簡單例子已經很困難。」是我的確切體驗,所以我很高興聽到我並不孤單。再次感謝!! – aaronlevin

+0

僅供參考我先用bottle.py(帶有一個長子處理腳本)嘗試了這個,並且遇到了一些阻塞問題。隨着燒瓶它的效果很好。謝謝! – Nate

+0

如何讓多個客戶端同時同步接收信號? – r1d3h4rd

10

長輪詢是一個合理的解決方案,在Web Sockets提供給大多數瀏覽器的簡單,自然的支持之前,並且在與Flask應用程序輕鬆集成之前。但在2013年中期,Web Socket支持已經走過了很長的路。

Here is an example,與上面類似,但集成了Flask和Web套接字。它運行於服務器組件geventgevent-websocket之上。

注意這個例子並不打算成爲一個Web插座的傑作。它保留了很多lpoll結構,使它們更容易比較。但它立即提高了Web應用程序的響應能力,服務器開銷和交互性。