2011-08-22 89 views
2

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

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

是否有任何方法来更改apache或mod_wsgi配置或我的django应用程序,以便它不会重新加载我的Java库的每个http请求?

非常感谢。

安迪

+0

在您的项目/应用程序库的哪个部分加载?项目设置?在应用程序特定的文件? –

+0

该库被加载到我的一个特定于应用程序的文件中。如果尚未加载,该文件包含一个用于加载java库的类静态方法。 – Andy

+1

问题是,当在生产环境中使用Django时,更多的应用程序特定文件可能会被多次导入,所以您对Java库的调用将不止一次。在初始化Java VM之前,我和PyLucene有同样的问题。一个好的解决方案是在你的settings.py中加载库(它应该只在每个wsgi线程中导入一次),然后在你的应用程序中引用它。 –

回答

1

你可能只是感到困惑和实际使用为贫困的Apache/mod_wsgi的配置。具体而言,您可能在Apache prefork MPM中使用嵌入式模式。这很糟糕,因为Apache会使用大量的单线程进程,因此代码必须全部加载。这就是为什么你可能认为它发生在每个请求上,而不是同一个进程,实际上,每个请求都会遇到不同的进程。

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

编辑您的问题,并从Apache配置文件中添加您的Apache/mod_wsgi配置片段,并说明您正在使用的是哪个Apache MPM。

+0

谢谢 - 我能够看到django应用程序和外部Java库在prefork MPM设置中的每个单线程进程中通过降低StartServers数量以及mod_wsgi守护进程模式中的每个进程初始化一次。两者都适合我。 – Andy