在哪里定义Celery子任务队列

时间:2016-12-22 19:33:44

标签: django task celery task-queue celerybeat

我有一个可插拔的应用程序,我正在为Django系统开发。在其中,我有一个创建类似通知的任务:

installable_app.tasks

@app.task(name='tasks.generate_notifications')
def generate_notifications(...):

我有一个可插拔的应用程序,我正在为Django系统开发。在其中,我有一个创建类似通知的任务:

installable_app.tasks

@app.task(name='tasks.generate_notifications')
def generate_notifications(...):
  clients = get_list_of_clients()
  for client in clients:
    client_generate_notification.delay(client['name'], client['id'])
  return "Notification Generation Complete"

@app.task
def client_generate_notification(client_name, client_id):
  ...
  return result

现在我想要定期运行,这可以通过Celery Beat使用设置来完成。我也希望它在自己的队列中:

settings.py:

CELERYBEAT_SCHEDULE ={
  {'generate_schedule_notifications': {
     'task': 'tasks.generate_notifications',
     'schedule': crontab(hour=6, minute=0),
     'options': {'queue': 'notification_gen'},
     'args': ('schedule', 'Equipment', 'HVAC')},
  }
}

第一个任务generate_notifications在队列notification_gen上正确运行,但client_generate_notification子任务在默认队列上运行。

我知道我可以在@task装饰器中专门指定队列,但由于这是一个django应用程序,我宁愿指定它们实际运行的位置。

我已经研究过使用CELERY_ROUTES选项但是当我尝试它时,它似乎覆盖了我正在运行的其他任务的队列。

最佳做法是在CELERY_ROUTES中定义所有可能的队列,还是有更好的方法来设置我的任务,以便它们都在同一个队列上运行?

1 个答案:

答案 0 :(得分:0)

你想要it之类的东西吗?