Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有更好的方法通过HTTP为昂贵的阻塞式python进程的结果提供服务?_Python_Http_Mod Wsgi_Tornado - Fatal编程技术网

有没有更好的方法通过HTTP为昂贵的阻塞式python进程的结果提供服务?

有没有更好的方法通过HTTP为昂贵的阻塞式python进程的结果提供服务?,python,http,mod-wsgi,tornado,Python,Http,Mod Wsgi,Tornado,我们有一个web服务,它可以为较大MP3文件的固定目录中的任意小片段提供服务。MP3文件由python应用程序动态生成。模型是,向指定所需片段的URL发出GET请求,得到音频/mpeg流作为响应。这是一个昂贵的过程 我们使用Nginx作为前端请求处理程序。Nginx负责缓存常见请求的响应 我们最初尝试在后端使用Tornado来处理来自Nginx的请求。正如您所料,阻塞MP3操作阻止了Tornado完成它的任务(异步I/O)。因此,我们采用了多线程技术,解决了阻塞问题,并且性能相当好。然而,它引入

我们有一个web服务,它可以为较大MP3文件的固定目录中的任意小片段提供服务。MP3文件由python应用程序动态生成。模型是,向指定所需片段的URL发出GET请求,得到
音频/mpeg
流作为响应。这是一个昂贵的过程

我们使用Nginx作为前端请求处理程序。Nginx负责缓存常见请求的响应

我们最初尝试在后端使用Tornado来处理来自Nginx的请求。正如您所料,阻塞MP3操作阻止了Tornado完成它的任务(异步I/O)。因此,我们采用了多线程技术,解决了阻塞问题,并且性能相当好。然而,它引入了一个微妙的竞争条件(在现实世界的负载下),我们还无法诊断或再现。竞争条件破坏了我们的MP3输出

因此,我们决定将应用程序设置为Apache/mod_WSGI(前面仍然是w/Nginx)后面的一个简单的WSGI处理程序。这消除了阻塞问题和竞争条件,但在实际情况下会在服务器上创建级联负载(即Apache创建太多进程)。我们现在正在对Apache/mod_wsgi进行调优,但仍处于试错阶段。(更新:我们已经切换回龙卷风。见下文。)

最后,问题是:我们遗漏了什么吗?有没有更好的方法通过HTTP为CPU昂贵的资源提供服务

更新:多亏了格雷厄姆的见多识广的文章,我很确定这是一个Apache调优问题。与此同时,我们又回到了使用Tornado,并试图解决数据损坏问题


<> P>对于那些在这个问题上抛出更多铁的人来说,龙卷风和一点点多线程(尽管线程引入的数据完整性问题)在一个小的(单核)Amazon EC2实例上处理可接受的负载。

< P>您可以考虑使用Ajax通知方法的排队系统。 每当有对昂贵资源的请求,并且需要生成该资源时,将该请求添加到队列中(如果该请求尚未存在)。该排队操作应返回一个对象的ID,您可以查询该ID以获取其状态

接下来,您必须编写一个后台服务来启动工作线程。这些工作人员只是将请求出列,生成数据,然后将数据的位置保存在请求对象中

该网页可以对服务器进行AJAX调用,以了解生成进度,并在文件可用时提供指向该文件的链接

这就是大型媒体网站的工作原理——尤其是那些必须处理视频的网站。然而,对于你的MP3工作来说,这可能有点过头了


或者,研究运行几台机器来分配负载。Apache上的线程仍然会阻塞,但至少不会占用web服务器上的资源。

看起来您做得不错——只是缺少CPU电源:您能确定生成这些MP3的过程中CPU的负载是多少吗

我想接下来你要做的就是添加更多的硬件来在其他机器上播放MP3。或者找到一种交付预渲染MP3的方法(也许你可以使用一些媒体?)


顺便说一句,雅各布·卡普兰·莫斯(Jacob Kaplan Moss)今年在PyCon Brasil上的一次主旨演讲的主题是网络的扩展,而这远不是一个封闭的问题。一个人需要处理的一堆技术非常令人印象深刻(尽管我找不到演示文稿的在线副本--对此表示抱歉)

你试过了吗?它是一个具有灵活线程模式分类的WSGI服务器。

您是否犯了使用Apache/mod_WSGI的嵌入式模式的错误?阅读:

如果使用Apache/mod_wsgi,请确保使用守护程序模式。

请定义“级联负载”,因为它没有共同的含义

您最可能遇到的问题是,您运行的Apache进程太多


对于这样的负载,请确保使用prefork mpm,并确保将自己的进程数限制在适当的范围内(每个CPU不少于一个,不超过两个)。

我们提供的是固定存储的较大MP3文件中的任意小片段。模型是,向指定所需片段的URL发出GET请求,得到一个
音频/mpeg
流作为响应,这样AJAX就不起作用了那么,我们回到我的第二点:分配负载。Linux机器很便宜。当我们在Tornado服务时,我们肯定不需要更多的硬件。问题可能只是调优Apache。优秀的文章。谢谢事实上,我将接受这个链接作为最佳答案,因为这个问题看起来确实是Apache的调优问题。所谓“级联负载”,我的意思是Apache毫无意愿地产生了进程。抱歉弄糊涂了。格雷厄姆的联系似乎很好地解释了这种情况。我得调查一下。