簡體   English   中英

調用慢速Python CGI腳本時,如何避免網頁收到網關超時?

[英]How can I avoid webpage receiving Gateway Timeout when calling slow Python CGI script?

我在EC2中設置了一個LAMP服務器。 在此網絡服務器上的/var/www/html/托管的一個簡單網站允許用戶通過輸入表單上載正在討論的人的音頻文件:

<form action="../cgi-bin/store_mp3_view" method="post" accept-charset="utf-8" enctype="multipart/form-data">
    <label for="mp3">Audio file</label>
    <input type="file" name="filename" />
    <input type="submit" value="Upload" />
</form>

該音頻文件存儲在/tmp/ 如您所見,這觸發了我在cgi-bin中擁有的Python腳本。 這是腳本: http : //pastebin.com/iNU6WSUV 然后,此腳本將從我的Web服務器上載的音頻文件上傳到Honda的API,該API將檢測發音並為每個發音生成一個音頻文件,以及一個包含每個發音元數據的json對象。 似乎可以單獨獲取語音文件,也可以從Hondas API中獲取每種語音的json: https ://api.hark.jp/docs/en/05_reference_webapi.html。 我的腳本等待所有這些處理完成(所有話語要處理並准備就緒),然后檢索每個音頻文件並將其發送到Bing Speech API以從語音中獲取文本。 這是因為當會話按順序/實時發生時,我想在瀏覽器中播放每個話語音頻文件以及關聯的文本和元數據。 一個玩家,如果願意的話。 問題是所有這些都花費了很長時間,因為瀏覽器正在從cgi腳本接收網關超時。 可能要花幾分鍾。 具體來說,Hark需要一段時間才能返回音頻分析的完整結果,但是看來我可以查詢其API並檢索中間結果,如前所述。 但是,語音未按順序結束,因此語音3可能在語音2之前就已經准備好了,但是我需要在語音3之前顯示2,因為對話具有一定的語音順序。 構建能夠做到這一點的應用程序的最佳方法是什么? 如何才能使這些API調用后台化,從而不會阻塞並導致超時? 我應該在此Web應用程序中使用Flask之類的東西嗎? 反復輪詢並從Hark檢索結果時,如何在網頁中呈現結果? CGI是工作的錯誤工具嗎? 謝謝。

通常,處理長時延的方法是使用yield並將部分數據發送給客戶端。 而不是obj.wait()您需要一個循環來檢查狀態是否已完成,以及是否未打印如下內容: ...並休眠一秒鍾。 這樣,您將不會收到超時。

盡管Ali Nikneshans的回答很有幫助,但CGI似乎並不是完成這項工作的正確工具。 我決定停止使用LAMP堆棧/ CGI應用程序,並設置具有Web套接字的Tornado Web服務器,這使我可以輕松進行異步調用,后台任務,並使用協程來設置數據管道以輪詢API端點並提供數據進入瀏覽器。

該演示文稿對理解協程非常有幫助:

http://www.dabeaz.com/coroutines/Coroutines.pdf

對於龍卷風:

http://www.tornadoweb.org/en/stable/index.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM