我有一个应用程序在芹菜中按预期工作,直到我设置CELERY_ALWAYS_EAGER = False。
# 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_ids重新附加到我的原始作业。这就是我想要的。
但是,一旦我设置了CELERY_ALWAYS_EAGER = False,我会将所有的report_id写回,除了3,它们总是相同的。这三项工作在重要方面类似,使其与其他工作区别开来。
现在,这是我没有得到的。如果我随机播放作业列表(即random.shuffle(作业),我会得到6-8个失败的id写入。它会有所不同。
有谁能让我知道这里可能会发生什么?
此外,当我尝试检查task_id的状态以查找失败的作业而不是获取状态字符串(例如'PENDING','SUCCESS')时,我得到task_id哈希值。
知道如何调试此问题,或者它可能是什么?
答案 0 :(得分:0)
问题在于有多个芹菜实例正在运行。
如果您遇到奇怪的芹菜问题,无视传统调查,请务必检查芹菜过程:
ps -ef | grep celery
确保您认识到所有这些。在我的情况下,有一个旧的芹菜过程耗尽主管,我已经忘记了。它只会在某些情况下受到干扰,当它进入某个神秘的位置时会吞下我的记录尝试。