jcc.initVM() не возвращается, когда mod_wsgi настроен как режим демона
Я использую mod-wsgi с django, а в django я использую пилицен для полнотекстового поиска.
Хотя 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 ответа
Подробности см. В http://code.google.com/p/modwsgi/issues/detail?id=131.
Короче говоря, mod_wsgi будет блокировать сигналы для программы-демона, что может заставить initVM не работать. Более того, согласно Andi из jcc, initVM может вызываться только из основного потока, что также может вызвать дальнейшие проблемы.
Поэтому я решил переместить поисковый код с помощью initVM() в совершенно отдельный процесс и решил проблему.