jcc.initVM() не возвращается, когда mod_wsgi настроен как режим демона
Вопрос
Я использую mod-wsgi с django, а в django я использую pylucene для полнотекстового поиска.
Хотя mod-wsgi настроен на встроенный режим, проблем не возникает.Но когда Mod-WSGI настроен как режим Daemon, Apache просто застрянет, а браузер просто продолжает загружать, но ничего не появляется.
Затем я идентифицирую проблему как jcc.initVM().Вот мой сценарий wsgi:
import os, sys, jcc
sys.stderr.write('jcc.initVM\n')
jcc.initVM()
sys.stderr.write('finished jcc.initVM\n')
....
После того, как я перезапустил свой Apache и сделаю запрос из моего браузера, я обнаружил, что /Вар/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
Решение
Исправление этой проблемы было включено в mod_wsgi 2.4.
Другие советы
Пожалуйста, обратитесь к http://code.google.com/p/modwsgi/issues/detail?id=131 для подробностей обсуждения.
Короче говоря, MOD_WSGI будет блокировать сигналы для программы Daemon, которая может сделать initVM не работать.Кроме того, согласно Andi из JCC, initVM может быть вызван только из основного потока, и это также может вызвать дальнейшую проблему.
Поэтому я решил перенести код поиска с помощью initVM() в совершенно отдельный процесс и решил проблему.