【发布时间】:2015-12-08 17:59:29
【问题描述】:
在我设置 CELERY_ALWAYS_EAGER = False 之前,我有一个可以在 celery 中按预期工作的应用程序。
# main file
jobs = get_report_jobs_from_db()
for job in jobs:
out = run_job.delay(job)
status, id = out.state, out.task_id
# Should be status string and UUID.
save_job(job, status, id) # record to db
# On bad calls status == id and is a UUID.
# celery file
from foo import do_something, write_id_back
@celery.task
def run_job(job):
id = do_something(job) # do_something returns a report_id
write_id_back(job, id) # write that id back to the originating job record
#foo file
def do_something(job):
prep_data = prep_job(job)
report_id = mysql_insert(job, prep_data)
# A report_id is returned if the insert suceeds otherwise it is
# null. The INSERT always works if I run
# CELERY_ALWAYS_EAGER = True, but if redis is involved it fails
# routinely
return report_id
如果我在 CELERY_ALWAYS_EAGER = True 下运行我的代码,绕过 redis,我会将所有 report_id 重新附加到我的原始作业。这就是我想要的。
但是,一旦我设置 CELERY_ALWAYS_EAGER = False,除了 3 之外,我的所有 report_id 都会被写回,而且它们总是相同的。这三个工作在区别于其他工作的重要方面是相似的。
现在,这就是我不明白的。如果我打乱作业列表(即 random.shuffle(jobs),我会收到 6-8 次失败的 id 写入。它会有所不同。
谁能告诉我这里可能发生的事情?
此外,当我尝试检查 task_id 的状态以查找失败的作业而不是获取状态字符串(例如“PENDING”、“SUCCESS”)时,我会返回 task_id 哈希。
知道如何调试这个问题,或者它可能是什么?
【问题讨论】:
-
您能否展示更多代码和输出来说明正在发生的事情?
-
我现在最担心的是为什么 celery 会返回一个 UUID 而不是失败作业的状态描述字符串?
-
好吧,您并没有真正显示输出 - 您只是在代码中添加了一些 cmets。使用来自 ipython 的实际输出进行更新,该输出准确地说明了正在发生的事情
-
我很难获得有用的反馈。这是问题的一部分。我现在遇到的一个大问题是,为什么 celery 会在 AsyncResult 中为错误条目返回一个 task_id 而不是一个状态?
-
您没有得到有用的反馈,因为您没有提供有用的信息,并且您忽略了提供该信息的请求。