理解celery和celery milti之间的区别?

0 投票
1 回答
650 浏览
提问于 2025-04-18 06:15

当我用一个工作进程运行Celery,命令是celery worker -A myapp -l info时,一切都很好,任务都能正常执行。

但是当我在同一个目录下运行celery multi start 2 -Q:1 message_send -Q:2 message_manager时,我收到了一个'收到未注册的任务'的错误。 当我运行两个工作进程时,Celery是怎么发现任务的呢?

我的celery.py文件内容是:

# coding: utf-8
from __future__ import absolute_import    
import os    
from celery import Celery   
from django.conf import settings    
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myapp.settings.local')

my_app = Myapp('Myapp', include=['myapp.messages.tasks'])

my_app.config_from_object('django.conf:settings')

my_app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)


@my_app.task(bind=True)
def debug_task(self):
    print('Request: {0!r}'.format(self.request))

我的设置是:

CELERY_ROUTES = {'messages.tasks.send_message': {'queue': 'message_send'},
                 'messages.tasks.control_message_send': {'queue': 'message_manager'}}
CELERY_IMPORTS = ('messages.tasks')

我的项目结构是:

myapp
    --settings
    --messages
    |  --fixtures
    |  --migrations
    |  --tests
    |    -- __init__.py
    |    -- api.py
    |    -- tasks.py
    |    -- models.py
    |    -- views.py
    -- __init__.py
    -- celery.py
    -- urls.py
    -- utils.py

更新: 问题出在导入上。 https://stackoverflow.com/a/23604197/1858864

1 个回答

2

如果你在用Django搭配Celery,最好通过manage.py来启动Celery的工作进程。Celery(或者django-celery)里有一些预装的命令可以直接使用。

# (just one worker)
python manage.py celeryd -Q myqueue -E -l info

# two workers
python manage.py celeryd_multi 1 2 -Q:1 message_send -Q:2 message_manager

不过,如果你不想用Django的命令,可以像下面这样用命名的方式来启动多个Celery工作进程。

celery multi start 1 2 -Q:1 message_send -Q:2 message_manager

这里的1和2就是工作进程的名字。

想了解更多信息,可以使用 celery multi --help 命令。

撰写回答