在调用慢速Python CGI脚本时,如何避免网页接收网关超时?

时间:2016-06-22 22:26:05

标签: python web-services

我在EC2中设置了LAMP服务器。在/var/www/html/中的此Web服务器上托管的简单网站允许用户通过输入表单上传有讨论者的音频文件:

<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服务器上传到本田的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调用设置为不阻止并导致超时?我应该在这个网络应用程序中使用像Flask这样的东西吗?当我从Hark迭代轮询并检索它们时,如何在网页中呈现结果? CGI是错误的工具吗?感谢。

2 个答案:

答案 0 :(得分:1)

通常,处理长延迟的方法是使用yield并将部分数据发送到客户端。而不是obj.wait(),您需要一个循环来检查状态是否已完成,如果不打印如下:...并且睡眠一秒钟。这样你就不会收到超时。

答案 1 :(得分:0)

虽然Ali Nikneshans的回答很有帮助,但似乎CGI不适合这项工作。我决定停止使用LAMP堆栈/ CGI应用程序并设置带有Web套接字的Tornado Web服务器,这允许我轻松地执行异步调用,后台任务,并使用协同程序来设置数据管道以轮询API端点并提供数据进入浏览器。

此演示文稿对于理解协程非常有用:

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

对于龙卷风:

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