jcc.initVM()在使用mod_wsgi作为守护进程模式配置时无法返回。

3
我正在使用mod-wsgi和django,在django中我使用pylucene进行全文搜索。
当mod-wsgi被配置为嵌入模式时,没有任何问题。 但是当mod-wsgi被配置为守护进程模式时,apache会卡住, 浏览器一直在加载但是什么也没有出现。
然后我确定问题是jcc.initVM()。 以下是我的wsgi脚本:
import os, sys, jcc
sys.stderr.write('jcc.initVM\n')
jcc.initVM()
sys.stderr.write('finished jcc.initVM\n')
....

当我重新启动apache并从浏览器发出请求时,我发现/var/log/apache2/error.log只有:

jcc.initVM

意思是它在jcc.initVM()一行卡住了。(如果mod_wsgi配置为嵌入模式,则没有问题。)
下面是我的/etc/apache2/sites-available/default文件:
WSGIDaemonProcess site user=ross group=ross threads=1
WSGIProcessGroup site
WSGIScriptAlias / /home/ross/apache/django.wsgi

<Directory /home/ross/apache/>
  Order deny,allow
  Allow from all
</Directory>

最后,我发现在jcc(jcc.cpp)的源代码中,它卡在以下函数处:

JNI_CreateJavaVM(&vm, (void **) &vm_env, &vm_args)

如何解决问题?

程序版本:

libapache2-mod-wsgi 2.3-1
jcc 2.1
python 2.5
Apache 2.2.9-8ubuntu3
Ubuntu 8.10
2个回答

1

这个问题的解决方案已经包含在mod_wsgi 2.4中。


1
请参考http://code.google.com/p/modwsgi/issues/detail?id=131以获取讨论详情。
简而言之,mod_wsgi将为守护程序阻止信号,这可能会导致initVM无法工作。此外,根据来自jcc的Andi的说法,只能从主线程调用initVM,并且这也可能会引起进一步的问题。
因此,我决定将带有initVM()的搜索代码移动到完全独立的进程中,并解决了这个问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接