在 redis 作业上存储“元”数据不起作用?

Joh*_*Mee 3 python redis python-rq

我正在尝试测试排队的 redis 作业,但是 meta数据似乎没有在任务和发起者之间传递。job_id 似乎匹配,所以我很困惑。也许一些新鲜的眼睛可以帮助我解决这个问题:

任务是根据文档:

from rq import get_current_job

def do_test(word):
    job = get_current_job()
    print job.get_id()
    job.meta['word'] = word
    job.save()
    print "saved: ", job.meta['word']
    return True
Run Code Online (Sandbox Code Playgroud)

该rqworker日志打印JOB_ID和Word在保存后

14:32:32 *** Listening on default...
14:33:07 default: labeller.do_test('supercalafragelistic') (a6e2e579-df26-411a-b017-8788d621149f)
a6e2e579-df26-411a-b017-8788d621149f
saved:  supercalafragelistic
14:33:07 Job OK, result = True
14:33:07 Result is kept for 500 seconds.
Run Code Online (Sandbox Code Playgroud)

该任务是从单元测试调用的:

class RedisQueueTestCase(unittest.TestCase):
    """
    Requires running "rqworker" on the localhost cmdline
    """
    def setUp(self):
        use_connection()
        self.q = Queue()

    def test_enqueue(self):
        job = self.q.enqueue(do_test, "supercalafragelistic")
        while True:
            print job.get_id(), job.get_status(), job.meta.get('word')
            if job.is_finished:
                print "Result: ", job.result, job.meta.get('word')
                break
            time.sleep(0.25)
Run Code Online (Sandbox Code Playgroud)

并生成此日志,显示相同的 job_id 和正确的结果,但从未填充该meta变量word。

Testing started at 2:33 PM ...
a6e2e579-df26-411a-b017-8788d621149f queued None
a6e2e579-df26-411a-b017-8788d621149f finished None
Result:  True None

Process finished with exit code 0
Run Code Online (Sandbox Code Playgroud)

我尝试添加一个很长的延迟,以便日志有机会在 started,但未完成状态(以防元在完成时被清除),但它没有任何区别。

知道我错过了什么吗?

Joh*_*Mee 5

save在远程端发生a 后,本地作业不会自动更新自身。必须做一个refresh来更新它。在重构之前,这不是必需的,因为我fetch_job对每个请求都使用 job_id。

所以测试例程需要包含一个refresh()(或 fetch_job)来反映任何变化:

def test_enqueue(self):
    job = self.q.enqueue(do_test, "supercalafragelistic")
    while True:
        job.refresh()     #<--- well, duh, freddy
        print job.get_id(), job.get_status(), job.meta.get('word')
        if job.is_finished:
            print "Result: ", job.result, job.meta.get('word')
            break
        time.sleep(0.25)
Run Code Online (Sandbox Code Playgroud)

哪个效果更好:

Testing started at 5:14 PM ...
6ea0163f-b5d5-411a-906a-f765aa0b3cc6 queued None 0 []
6ea0163f-b5d5-411a-906a-f765aa0b3cc6 started supercalafragelistic
6ea0163f-b5d5-411a-906a-f765aa0b3cc6 finished supercalafragelistic
Result:  True supercalafragelistic
Run Code Online (Sandbox Code Playgroud)

get_status正在更新的事实使我忽略了这一点:get_status()是一种查找当前状态的方法,而meta只是指向某处可能过时的数据的指针。