【问题标题】:Celery + Redis IssueCelery + Redis 问题
【发布时间】: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 而不是一个状态?
  • 您没有得到有用的反馈,因为您没有提供有用的信息,并且您忽略了提供该信息的请求。

标签: python redis celery


【解决方案1】:

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

如果您遇到无法常规调查的奇怪 celery 问题,请务必检查您的 celery processes:

ps -ef | grep celery

确保您认识所有这些。就我而言,有一个旧的 celery 进程耗尽了我忘记的主管。它只在某些情况下发生干扰,并且会在它对某个神秘位置进行记录时吞下我的记录尝试。

【讨论】:

    猜你喜欢
    • 2012-03-01
    • 2019-12-08
    • 2016-06-09
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 2014-06-06
    • 2018-08-06
    • 2020-11-10
    相关资源
    最近更新 更多