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

如何使Ruby或Python网站使用多核?,python,ruby,multithreading,multicore,Python,Ruby,Multithreading,Multicore,即使和每个解释器线程有一个内核线程,它们也有一个全局解释器锁(GIL),用于保护潜在的共享数据结构,因此这会抑制多处理器执行。即使在C语言或C++中编写的那些语言中的部分可以是自由线程的,但是除非使用多个进程,否则这是不可能的。实现这一目标的最佳方式是什么?创建一组虚拟化服务器?JRuby和Jython?使用Java等价物,使用一个在单独的解释器中运行每个响应的接口,例如Python的mod_wsgi。这样就可以在不遇到GIL的情况下使用多线程 编辑:显然,mod_wsgi不再支持每个进程使用多

即使和每个解释器线程有一个内核线程,它们也有一个全局解释器锁(GIL),用于保护潜在的共享数据结构,因此这会抑制多处理器执行。即使在C语言或C++中编写的那些语言中的部分可以是自由线程的,但是除非使用多个进程,否则这是不可能的。实现这一目标的最佳方式是什么?创建一组虚拟化服务器?JRuby和Jython?

使用Java等价物,使用一个在单独的解释器中运行每个响应的接口,例如Python的
mod_wsgi
。这样就可以在不遇到GIL的情况下使用多线程


编辑:显然,
mod_wsgi
不再支持每个进程使用多个解释器,因为白痴们不知道如何正确实现扩展模块。尽管如此,它仍然支持在FastCGI风格的单独进程中运行请求,因此这显然是当前公认的解决方案。

我不完全确定您想要解决的问题是什么,但是,如果使用mod_python通过apache prefork MPM部署python/django应用程序,apache将启动几个工作进程来处理不同的请求


如果一个请求需要如此多的资源,以至于您想要使用多个核心,请查看。但是我不认为这是明智的。

使用rails实现这一点的“标准”方法是运行一个“包”的混合实例(即:rails应用程序的4个副本),然后使用apache或nginx或其他软件坐在它们前面,充当负载平衡器

其他ruby框架(如merb等)可能就是这样做的,但我个人还没有使用过

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


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

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

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

无需生成新流程,只需在请求之间重复使用即可。是,当然,您可以对多个请求重用一个进程,因为您可以使用线程池来避免每个请求产生一个线程。我的意思是,您必须为每个应该使用的核心生成自己的进程。