【问题标题】:initializing module on django+mod_wsgi+apache在 django+mod_wsgi+apache 上初始化模块
【发布时间】:2011-08-22 01:11:43
【问题描述】:

我的 django 应用程序在 apache+wsgi 上运行。我的 django 应用程序中的一个模块需要通过 jpype 加载 Java 库,并且由于其应用程序性质,这个 Java 库需要很长时间来初始化。

问题在于,对于 django 在 apache+wsgi 设置中处理的每个 http 请求,都会重新加载这个 Java 库。但是,当我在开发 Web 服务器(python manager.py runserver 8000)中运行我的同一个应用程序时,这不会发生。在开发 Web 服务器中,它只加载 Java 库一次。

有什么方法可以更改 apache 或 mod_wsgi 配置或我的 django 应用程序,使其不会为每个 http 请求重新加载我的 Java 库?

非常感谢。

安迪

【问题讨论】:

  • 在您的项目/应用程序的哪个部分加载了库?项目设置?在特定于应用的文件中?
  • 该库已加载到我的应用程序特定文件之一中。该文件包含一个类静态方法来加载 java 库(如果尚未加载)。
  • 问题在于,当在生产环境中使用 Django 时,可能会多次导入特定于应用程序的文件,因此您对 Java 库的调用将不止一次。在初始化 Java VM 之前,我对 PyLucene 有同样的问题。一个好的解决方案是在您的 settings.py 中加载该库(每个 wsgi 线程应该只导入一次),然后在您的应用程序中引用它。
  • 当我尝试这个时,jpype 崩溃了。文件“/Library/Python/2.6/site-packages/jpype/_core.py”,第 44 行,在 startJVM _jpype.startup(jvm, tuple(args), True) RuntimeError: Unable to start JVM at src/native/common /jp_env.cpp:54 位置 0x8 的内存访问无效 rip=0x10168aed0
  • 那我想我没有适合你的解决方案。对于我的 lucene 安装,这种方法有效。不过,我并不是真正的 Java 人,如果可能的话,尽量避免使用其他语言的库。祝你好运找到解决方案。

标签: python django apache wsgi django-wsgi


【解决方案1】:

您可能只是感到困惑,实际上是在使用糟糕的 Apache/mod_wsgi 配置。具体来说,您很可能将嵌入式模式与 Apache prefork MPM 一起使用。这很糟糕,因为 Apache 将使用大量单线程进程,因此必须在所有进程中加载​​代码。这就是为什么您可能认为它发生在针对同一进程的每个请求上,而实际上,每个请求都针对不同的进程。

确保您使用的是 mod_wsgi 的守护程序模式,并且您的代码是线程安全的,因此使用单多线程进程应该不会出现问题。

编辑您的问题并从 Apache 配置文件中添加您的 Apache/mod_wsgi 配置 sn-ps 并说明您正在使用的 Apache MPM。

【讨论】:

  • 谢谢 - 我能够看到 django 应用程序和外部 Java 库在 prefork MPM 设置中的每个单线程进程中通过降低 StartServers 编号被初始化一次,并且在 mod_wsgi 的守护程序模式下的每个进程中也被初始化一次。两者都适合我。
猜你喜欢
  • 2017-10-11
  • 2018-05-31
  • 2019-06-22
  • 2012-07-14
  • 2012-06-09
  • 2012-03-17
  • 1970-01-01
  • 2012-05-13
  • 1970-01-01
相关资源
最近更新 更多