我有一个功能正常的Django应用,在我的视图中有许多Google Text-To-Speech API调用和数据库读/写。在本地测试时,加载页面大约需要3秒钟,但是当我将应用程序实时部署到Heroku时,则需要大约15秒钟才能加载网页。因此,我正在尝试减少加载时间。
我碰到了这篇文章:https://devcenter.heroku.com/articles/python-rq建议我应该通过使用RQ(Redis Queue)库将作业排队给工作人员来使用后台任务。我按照他们的步骤进行操作,并将他们的worker.py
文件包含在与我的manage.py
文件相同的目录中(不确定是否是放置文件的正确位置)。我想使用虚拟函数在本地对其进行测试,然后查看它是否可以正常运行。
# views.py
from rq import Queue
from worker import conn
def dummy(foo):
return 2
def my_view(request):
q = Queue(connection=conn)
for i in range(10):
dummy_foo = q.enqueue(dummy, "howdy")
return render(request, 'dummy.html', {})
我在单独的终端中运行:
$ python worker.py
$ python manage.py runserver
但是在加载网页时,我在"Apps aren't loaded yet."
终端上收到了许多python worker.py
错误消息。我还没有尝试部署到Heroku,但是我想知道为什么我在本地收到此错误消息?
答案 0 :(得分:0)
您没有发布worker.py
的代码,但是我敢打赌它不能正确初始化Django。查看manage.py
的内容以查看示例。因此,如果worker.py
试图实例化(或什至导入)任何模型,视图等,您将得到这种错误。 Django需要解析settings.py
(除其他事项外),然后使用它来查找数据库设置,解析模型/关系等。
最简单的方法是使用django-rq
,这是一个将RQ和Django集成在一起以处理所有这些问题的简单库。您的worker.py
实际上就是python manage.py rqworker
。
答案 1 :(得分:0)
迟到总比不到好。
Django-rq需要Django2.0,很遗憾,对于我们的项目,没有计划升级到最新版本。
因此,如果您处在相同的情况下,仍然可以使用普通的RQ,只需在 worker.py (worker_django_1_11)中添加以下两行:
import django
django.setup()
并传递工人类,如:
> DJANGO_SETTINGS_MODULE=YOURPROJECT.settings rq worker --worker-class='worker_django_1_11.Worker'