Celery异步任务只执行一次

时间:2014-01-21 18:39:04

标签: python rabbitmq celery

所以我有一个任务,我可以从中调用另一个发送电子邮件的任务:

@app.task(name='login.sync.register')
def register(user_obj):
    result = user_service.register(user_obj)

    from .async import send_verification_email
    send_verification_email.delay(result['user']['id'])

    return result

电子邮件发送任务是:

@app.task(name='login.async.send_verification_email', bind=True, max_retries=3)
def send_verification_email(self, user_id):
    try:
        email_service.send_verification_email(user_id)
    except Exception as exc:
        raise self.retry(exc=exc)

它第一次完美运作。电子邮件发送。当我第二次调用注册任务时,它会成功,但不会执行send_verification_email。我在日志中看不到任何内容。

知道为什么吗?当我重新启动Celery工作时,它会在第一时间发送电子邮件,但之后会停止发送电子邮件。

1 个答案:

答案 0 :(得分:0)

首先,我认为像你这样使用广泛的异常处理程序是一个坏主意。除了异常,因为exc会隐藏你的任何问题,你永远不会知道 - 实际发生了什么。

您可以在删除异步调用并使其同步后调试代码:

send_verification_email(结果[ '用户'] [ 'ID'])

我会解释。您需要删除所有.delay调用并直接调用您的任务。在send_verification_email()任务中你可以插入行

import pdb; pdb.set_trace()

跟踪电话并观看email_service.send_verification_email(user_id)的结果。

@app.task(name='login.async.send_verification_email', bind=True, max_retries=3)
def send_verification_email(self, user_id):
    import pdb;pdb.set_trace()
    email_service.send_verification_email(user_id)

此外,你可以用pudb替换pdb,这是更友好的。您可以使用'pip install pudb'

进行安装

我无法发表评论,因为我刚注册并且没有卡玛。