6

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

4

5 回答 5

4

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

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

于 2008-08-31T21:53:30.797 回答
4

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

这可能是使用其他 ruby​​ 框架(如 merb 等)的方式,但我个人没有使用过这些框架。

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

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

于 2008-08-31T22:41:55.827 回答
1

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

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

于 2008-08-31T21:43:58.480 回答
1

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

于 2008-10-10T07:18:15.943 回答
0

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

于 2008-10-10T13:24:31.713 回答