在Django中使用pylucene时,initVM和attachCurrentThread的最佳位置在哪里?

4 投票
1 回答
1774 浏览
提问于 2025-04-16 20:35

我在一个基于Django的网站上使用pylucene,想知道在哪里启动jvm(Java虚拟机)和连接线程比较好。我不想每次有人加载页面时都启动一个新的jvm,但有时在搜索时连接线程时,我会遇到一个很奇怪的错误:“无法导入名称”。

在views.py里连接线程是不是个错误?

编辑:我特别想找到一种方法,能够启动一个单独的jvm并让它一直运行,这样我就可以根据需要连接线程。启动jvm大约需要两秒钟,这在搜索时会造成明显的延迟。

1 个回答

4

我在Django中从来没有用过pylucene,不过initVM()这个函数应该在一个在Django服务器启动时就会加载的文件中调用(settings.py是个不错的选择)。

关于attachCurrentThread:关键是你在哪里使用lucene模块。如果是在views.py里,那当然就在views.py里调用。不过我觉得你不应该在每次函数调用时都去调用它。如果你使用基于类的通用Django视图,可以把虚拟机环境保存在一个特定对象的变量里。你有没有尝试在views.py的全局范围内使用它?

另外,记住调用attachCurrentThread时总是涉及两个步骤:

vm_env = lucene.getVMEnv()
vm_env.attachCurrentThread()

补充说明(见下面的评论):

我觉得这取决于你在项目中是如何导入设置的。如果你在应用中只是用import settings,那么这个模块会被加载多次。最好总是用from django.conf import settings。据我所知,你的原始设置文件在服务器启动时只会被加载一次。

撰写回答