在生产中收到类型为KeyError的未注册任务

时间:2019-07-09 15:46:59

标签: python-3.x ubuntu celery supervisord

我有 Celery 定期任务,这些任务会做一些工作,然后再发送电子邮件给我。

它在本地计算机上运行完美,但在 DO Ubuntu服务器上失败,并出现错误:
Received unregistered task of type KeyError('periodic_tasks.send_email_task',)

我的 periodic_tasks.py 文件如下所示:

app = Celery('periodic_tasks', broker='')
logger = get_task_logger(__name__)

@app.task(soft_time_limit=2000, max_retries=2)
def send_email_task(task_db_id):
    db = DBMethods()
    client_listings = dw.generate_client_listings(db)
    current_task = db.get_scheduled_task_data(task_db_id)
    query = current_task.get('task_params').get('query')
    days_stay = current_task.get('task_params').get('days_stay')
    proxy = current_task.get('task_params').get('proxy')
    adults_count = int(current_task.get('task_params').get('adults_count'))
    pets_count = int(current_task.get('task_params').get('pets_count'))
    to_email = current_task.get('task_params').get('to_email')
    cc_email = current_task.get('task_params').get('cc_email')
    additional_text = current_task.get('task_params').get('additional_text')

    task_id = str(send_email_task.request.id),
    task_data = {
        "task_id": task_id,
        "task_name": "send_email_task",
        "task_args": [client_listings, query, proxy, days_stay, adults_count, pets_count,
                                 to_email, cc_email, additional_text],
        "task_start_at": datetime.now(),
        "task_status": 0
    }
    db.start_scheduled_task(task_data)

    try:
        logger.info(email_worker_new(db, client_listings, query, proxy, days_stay, adults_count, pets_count,
                                 to_email, cc_email, additional_text))

        db.finish_scheduled_task(task_id, 1, datetime.now(), 'success')
    except SoftTimeLimitExceeded:
        db.finish_scheduled_task(task_id, 9, datetime.now(), 'timeout')

app.conf.beat_schedule = {
    "send-email-001-task": {
        "task": "periodic_tasks.send_email_task",
        "schedule": crontab(minute="0", hour="*/2"),
        "args": ('email_001', )
    },
}

supervisord

中使用命令-celery -A periodic_tasks worker -B --loglevel=info运行celery

请帮帮我。我在生产上做错了什么?

1 个答案:

答案 0 :(得分:1)

这是一个典型的“问题”。

-您需要将最新代码重新部署到所有运行Celery worker的计算机上,以便它们注册有新任务。

您需要一个好的部署策略。您可以做的最简单的事情是,将打包的所有Celery任务构建为Python轮子,并在所有运行Celery的计算机上执行pip install -U your-project。当然,您还需要重新启动Celery ...

一旦有了新代码,并且Celery工作人员已经启动并运行,您可以通过运行celery -A periodic_tasks inspect registered来检查新任务是否已注册。您应该在此列表中看到新任务。