缩放Python CGI脚本

我有一台384kbps ADSL的四核Ubuntu服务器上运行的Apache。 用户通过网页forms上传文件,并通过各种作为CGI脚本运行的Python程序进行处理。 一些脚本是CPU密集型的,几分钟内运行在100%(在一个内核上) 这些将结果通过电子邮件发送给用户,因此HTTP会话不会保持打开状态。 一些脚本需要更大的文件(总共几MB)上传。 目前,使用率非常低,每天点击次数很less,如果有的话,甚至比同时使用这些服务的用户还要less。 我需要在中期为更多的用户提供这些服务。

我怀疑我build立的基础设施不容易扩展。 例如,一个用户请求我允许将多个file upload到CPU密集型程序。 这意味着机器将在较长的时间内忙碌。 如果其他用户也将多个file upload到同一个脚本,机器可能会变得非常忙,时间更长。

我知道讨论式的问题在这里是不允许的,所以我想问一下以下的具体问题:

在提供这些服务时,我需要考虑哪些策略或方法?也就是说,我需要完全重新考虑基础设施吗?

如果我没有做任何修改,每个10人上传10个文件到CPU密集型程序中,例如,CGI脚本创build的所有10个线程是否都能够愉快地(如果缓慢地)运行10个input文件呢? 让服务器以100%的CPU使用率运行一两小时或三小时是否“安全”?

如果你的Python编写得很好,并且模块化得体,那么它不应该太糟糕。

你需要做的是看看芹菜 ,并将其用作工作队列。

当用户提交文件进行处理时,它将被Celery排队,然后在资源可用时在同一台服务器上或由工作者节点处理。 Celery通常由RabbitMQ或Redis作为消息代理(实际队列服务器)提供支持,而且这些规模相对容易扩展。

就“完成工作”callback而言,有很多不同的选项可供select,您仍然可以使用电子邮件,或者您可以查看像Pusher这样的服务,将通知发送回提交用户的浏览器。

实际上,服务器被devise为在80-90%的CPU负载下运行。 我的意思是,这就是你最大限度利用你所投入力量的地方(有点儿)。

不过,我怀疑你是从家里托pipe的(因此ADSL上行速度很慢),而且实际上它可能只是一个重复使用的台式PC, 它不适合服务器types的占空比和负载。

作为开始,您应该考虑为您的应用程序使用WSGI接口,然后考虑实施一些asynchronous事件驱动库,如Celerygevent以将您的应用程序logix安排到任务中。

从内存和灵活性的angular度来看, CGI是调用外部代码的最古老也是效率bottle.py ,重新考虑你的项目使用任何python微型框架(例如bottle.pyflask ),这会给你一个更有状态的环境你可以连接逻辑(你的python代码)来处理前面提到的库。