我正在尝试按照解释here的方法,由工作人员运行一些异步函数。
这意味着,在我的tasks.py
文件中我有:
from django_rq import job
@job
def long_function(one_list):
#many stuff that should be done asynchrounously
然后在我的views.py
文件中:
from .tasks import long_function
def render_function(request):
#some code to get one_list
long_function.delay(one_list)
#some more code to render the page
return render(request, 'results_page.html', context)
目前我在本地进行测试。
因此,我打开了两个终端:一个用于运行python manage.py runserver
,另一个用于运行python manage.py rqworker default
。
因此,当我在浏览器中加载'results_page.html'时,我希望任务排队并开始使用rqworker运行。问题是这种情况只发生在一些随机时间,而在其余时间,rqworker的终端只显示:
*** Listening on default...
Sent heartbeat to prevent worker timeout. Next one should arrive within 420 seconds.
Sent heartbeat to prevent worker timeout. Next one should arrive within 420 seconds.
我的第一个想法是,当我同时使用两个不同的终端时,连接没有正确完成。但是,我认为这没有意义,因为有时异步任务会运行。
为什么工人有时没有看到任务?
答案 0 :(得分:0)
在this篇文章之后,我替换了delay
中的views.py
函数。
这
from .tasks import long_function
def render_function(request):
#some code to get one_list
long_function.delay(one_list)
#some more code to render the page
return render(request, 'results_page.html', context)
到
import django_rq
from .tasks import long_function
def render_function(request):
#some code to get one_list
queue = django_rq.get_queue('default')
queue.enqueue(long_function, one_list)
#some more code to render the page
return render(request, 'results_page.html', context)
它似乎正在发挥作用。不知道为什么,但是......