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 ответа

Решение

Исправление для этой проблемы было включено в mod_wsgi 2.4.

Подробности см. В http://code.google.com/p/modwsgi/issues/detail?id=131.

Короче говоря, mod_wsgi будет блокировать сигналы для программы-демона, что может заставить initVM не работать. Более того, согласно Andi из jcc, initVM может вызываться только из основного потока, что также может вызвать дальнейшие проблемы.

Поэтому я решил переместить поисковый код с помощью initVM() в совершенно отдельный процесс и решил проблему.

Другие вопросы по тегам