在Redis作业中存储“元”数据不起作用?

4
我正在尝试测试一个排队的redis作业,但似乎meta数据没有在任务和发起者之间传递。工作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

rqworker日志会在任务被保存后打印出任务ID和单词。

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.

这个任务是从一个单元测试中调用的:

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)

并生成此日志,显示相同的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

我尝试添加了一个长延迟,这样日志就有机会看到任务处于“已启动”但未完成状态(以防在任务完成时清除元数据),但没有任何效果。您有什么想法我可能错过了什么吗?
1个回答

6
本地的任务在远程端进行保存后不会自动更新。需要手动刷新才能更新。在重构之前,每次请求时我都会使用job_id执行fetch_job操作,因此不需要手动刷新。
因此,测试过程中需要包含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)

哪一个更有效一点:
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
< p > 事实上,get_status 的更新让我忽视了这一点:get_status() 是一个方法,用于查找当前状态,而 meta 只是指向某些可能过时的数据的指针。


我也被job.meta.save()的东西搞糊涂了。请随意接受这个答案 :p - webminal.org

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接