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

时间:2020-03-05 18:45:45  来源:igfitidea点击:

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

解决方案

回答

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

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

回答

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

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

回答

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

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

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

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

回答

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

回答

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