芹菜+ Redis问题



我有一个应用程序,如预期的工作在芹菜,直到我设置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,我将得到除3之外的所有report_id的回写,并且它们总是相同的。这三种工作在重要的方面是相似的,这使它们区别于其他工作。

现在,我不明白的是。如果我洗牌作业列表(即random.shuffle(jobs)),我得到6-8失败的id写。它变化。

谁能告诉我这里可能发生了什么?

此外,当我试图检查task_id的状态失败的作业,而不是获得一个状态字符串(例如。'PENDING','SUCCESS'),我得到task_id哈希值。

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

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

如果你遇到了奇怪的芹菜问题,而不是传统的调查,一定要检查你的芹菜过程:

ps -ef | grep celery

确保你认识所有的人。在我的例子中,有一个老的芹菜进程,我已经忘记了supervisor。它只在某些情况下干扰,并且当它对某些神秘位置进行干扰时,会吞噬我的日志记录尝试。

最新更新