rq queue always empty

572 Views Asked by At

I'm using django-rq in my project.

What I want to achieve: I have a first view that loads a template where an image is acquired from webcam and saved on my pc. Then, the view calls a second view, where an asynchronous task to process the image is enqueued using rq. Finally, after a 20-second delay, a third view is called. In this latter view I'd like to retrieve the result of the asynchronous task.

The problem: the job object is correctly created, but the queue is always empty, so I cannot use queue.fetch_job(job_id). Reading here I managed to find the job in the FinishedJobRegistry, but I cannot access it, since the registry is not iterable.

from django_rq import job
import django_rq
from rq import Queue
from redis import Redis
from rq.registry import FinishedJobRegistry

redis_conn = Redis()
q = Queue('default',connection=redis_conn)
last_job_id = ''

def wait(request): #second view, starts the job
    template = loader.get_template('pepper/wait.html')
    job = q.enqueue(processImage)
    print(q.is_empty()) # this is always True!
    last_job_id = job.id # this is the expected job id
    return  HttpResponse(template.render({},request))

def ceremony(request): #third view, retrieves the result
    template = loader.get_template('pepper/ceremony.html')
    print(q.is_empty()) # True
    registry = FinishedJobRegistry('default', connection=redis_conn)
    finished_job_ids = registry.get_job_ids() #here I have the correct id (last_job_id)
    return HttpResponse(template.render({},request))

The question: how can I retrieve the result of the asynchronous job from the finished job registry? Or, better, how can I correctly enqueue the job?

1

There are 1 best solutions below

0
On

I have found an other way to do it: I'm simply using a global list of jobs, that I'm modifying in the views. Anyway, I'd like to know the right way to do this...