2008-08-31 38 views
7

即使PythonRuby每个解释器线程都有一个内核线程,但它们具有用于保护潜在共享数据结构的全局解释器锁(GIL),因此这会禁止多处理器执行。尽管这些languajes中用C或C++编写的部分可以是自由线程的,但除非使用多个进程,否则纯粹的解释代码是不可能的。达到此目的的最佳方式是什么? Using FastCGI?创建一个cluster or a farm虚拟服务器?使用他们的Java等价物,JRuby和Jython?如何让Ruby或Python网站使用多个核心?

回答

1

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

编辑:显然,mod_wsgi不再支持每个进程的多个解释器,因为白痴无法弄清楚如何正确实现扩展模块。尽管如此,它仍然支持FastCGI风格的单独进程中的运行请求,所以这显然是目前接受的解决方案。

4

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

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

4

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

这可能是如何与其他ruby框架,如merb等,但我没有亲自使用过。

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

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

1

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

+0

没有必要产生新的进程,只需在请求之间重新使用它们。 – 2008-10-10 07:27:42

0

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