繁体   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