如何使Ruby或Python网站使用多个内核?

如何使Ruby或Python网站使用多个内核?

How to make Ruby or Python web sites to use multiple cores?

尽管Python和Ruby每个解释器线程都有一个内核线程,但是它们具有全局解释器锁(GIL),该锁用于保护潜在的共享数据结构,因此这会阻止多处理器执行。 即使用C或C ++编写的语言中的部分可以是自由线程的,但使用纯解释代码是不可能的,除非您使用多个进程。 实现此目标的最佳方法是什么? 使用FastCGI? 创建集群或虚拟服务器场? 使用它们的Java对等物,JRuby和Jython?


使用rails的"标准"方法是运行"包"的Mongrel实例(即:rails应用程序的4个副本),然后使用apache或nginx或其他软件坐在它们前面并采取行动作为负载均衡器。

这可能是通过其他ruby框架(例如merb等)完成的,但是我还没有亲自使用它们。

操作系统将负责在自己的CPU上运行每个杂种。

如果您安装mod_rails aka phusion passenger,它也会为您启动和停止rails进程的多个副本,因此最终将以类似的方式将负载分散到多个CPU /内核上。


我不确定要解决哪个问题,但是如果您使用mod_python apache通过apache prefork MPM部署python / django应用程序,则会启动多个工作进程来处理不同的请求。

如果一个请求需要那么多资源,那么您想使用多个内核,请看pyprocessing。但是我不认为这是明智的。


在Python和Ruby中,只能使用多个内核,以产生新的(重量级)进程。
Java对应者继承了Java平台的可能性。您可能暗示使用Java线程。例如,这就是为什么有时(通常)将像Glassfish这样的Java Application Server用于Ruby on Rails应用程序的原因。


使用在单独的解释器中运行每个响应的接口,例如用于Python的mod_wsgi。这样就可以使用多线程,而不会遇到GIL。

编辑:显然,mod_wsgi不再为每个进程支持多个解释器,因为白痴们无法弄清楚如何正确实现扩展模块。不过,它仍然支持以FastCGI样式在单独的进程中运行请求,因此,这显然是当前公认的解决方案。


对于Python,PyProcessing项目使您可以像使用线程一样使用进程进行编程。它作为multiprocessing包含在最近发布的2.6版本的标准库中。该模块具有许多功能,可用于建立和控制对共享数据结构(队列,管道等)的访问,并支持常见的习惯用法(即管理者和工作人员池)。


推荐阅读