【问题标题】:jcc.initVM() doesn't return when mod_wsgi is configured as daemon mode当 mod_wsgi 配置为守护程序模式时,jcc.initVM() 不返回
【发布时间】:2009-02-14 04:39:28
【问题描述】:

我在 django 中使用 mod-wsgi,在 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

【问题讨论】:

    标签: python apache mod-wsgi pylucene jcc


    【解决方案1】:

    mod_wsgi 2.4 中包含此问题的修复程序。

    【讨论】:

      【解决方案2】:

      详情请咨询http://code.google.com/p/modwsgi/issues/detail?id=131

      简而言之, mod_wsgi 将阻塞守护程序的信号,这可能使 initVM 无法工作。此外根据 jcc中的andi,initVM只能从主线程调用,也可能会导致进一步的问题。

      因此我决定将带有 initVM() 的搜索代码移至一个完全独立的进程并解决了问题。

      【讨论】:

        猜你喜欢
        • 2013-02-04
        • 2011-07-18
        • 1970-01-01
        • 2012-03-20
        • 2012-10-12
        • 2011-05-09
        • 2018-12-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多