Celery + Redis问题

时间:2015-09-12 06:28:01

标签: python redis celery

我有一个应用程序在芹菜中按预期工作,直到我设置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哈希值。

知道如何调试此问题,或者它可能是什么?

1 个答案:

答案 0 :(得分:0)

问题在于有多个芹菜实例正在运行。

如果您遇到奇怪的芹菜问题,无视传统调查,请务必检查芹菜过程:

ps -ef | grep celery

确保您认识到所有这些。在我的情况下,有一个旧的芹菜过程耗尽主管,我已经忘记了。它只会在某些情况下受到干扰,当它进入某个神秘的位置时会吞下我的记录尝试。