Celery收到未注册的任务类型(运行示例)


96

我正在尝试从Celery文档中运行示例

我跑: celeryd --loglevel=INFO

/usr/local/lib/python2.7/dist-packages/celery/loaders/default.py:64: NotConfigured: No 'celeryconfig' module found! Please make sure it exists and is available to Python.
  "is available to Python." % (configname, )))
[2012-03-19 04:26:34,899: WARNING/MainProcess]  

 -------------- celery@ubuntu v2.5.1
---- **** -----
--- * ***  * -- [Configuration]
-- * - **** ---   . broker:      amqp://guest@localhost:5672//
- ** ----------   . loader:      celery.loaders.default.Loader
- ** ----------   . logfile:     [stderr]@INFO
- ** ----------   . concurrency: 4
- ** ----------   . events:      OFF
- *** --- * ---   . beat:        OFF
-- ******* ----
--- ***** ----- [Queues]
 --------------   . celery:      exchange:celery (direct) binding:celery

task.py:

# -*- coding: utf-8 -*-
from celery.task import task

@task
def add(x, y):
    return x + y

run_task.py:

# -*- coding: utf-8 -*-
from tasks import add
result = add.delay(4, 4)
print (result)
print (result.ready())
print (result.get())

在同一文件夹celeryconfig.py中:

CELERY_IMPORTS = ("tasks", )
CELERY_RESULT_BACKEND = "amqp"
BROKER_URL = "amqp://guest:guest@localhost:5672//"
CELERY_TASK_RESULT_EXPIRES = 300

当我运行“ run_task.py”时:

在python控制台上

eb503f77-b5fc-44e2-ac0b-91ce6ddbf153
False

celeryd服务器上的错误

[2012-03-19 04:34:14,913: ERROR/MainProcess] Received unregistered task of type 'tasks.add'.
The message has been ignored and discarded.

Did you remember to import the module containing this task?
Or maybe you are using relative imports?
Please see http://bit.ly/gLye1c for more information.

The full contents of the message body was:
{'retries': 0, 'task': 'tasks.add', 'utc': False, 'args': (4, 4), 'expires': None, 'eta': None, 'kwargs': {}, 'id': '841bc21f-8124-436b-92f1-e3b62cafdfe7'}

Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/celery/worker/consumer.py", line 444, in receive_message
    self.strategies[name](message, body, message.ack_log_error)
KeyError: 'tasks.add'

请说明问题所在。


12
嗨,能否请您分享问题所在以及如何解决?接受的答案并不清楚其他人如何解决此问题。谢谢。
Jordan Reiter 2012年

3
我和乔丹在一起-这根本没有用。否决了。
杰伊·泰勒

2
aiho的答案是正确的:CELERY_IMPORTS = ("tasks", )
Alp

Answers:


49

您可以在 celery.registry.TaskRegistry课程中。可能是您的celeryconfig(在当前目录中)不在,PYTHONPATH因此celery找不到它,并恢复为默认值。在启动芹菜时,只需明确指定即可。

celeryd --loglevel=INFO --settings=celeryconfig

您也可以进行设置--loglevel=DEBUG,您可能应该立即发现问题。


4
为+1 --loglevel=DEBUG,我的任务出现语法错误。
雅各布·瓦伦塔

12
芹菜已过时。现在应该运行celery worker于如Django这样celery --app=your_app.celery worker --loglevel=info
andilabs

对于我(芹菜3.1.23),我不得不使用它celery.registry.tasks来查看所有当前任务的列表。您始终可以通过运行进行检查dir(celery.registry)
尼克·布雷迪

对于--loglevel=DEBUG我来说也是如此
Shobi

64

我认为您需要重新启动工作服务器。我遇到了同样的问题,并通过重新启动来解决。


8
谢谢!希望我在一小时前找到它
Nexus 2012年

2
这为我解决了。如果您使用的是celeryd脚本,则工作程序在启动时会导入您的任务模块。即使您随后创建更多任务功能或更改现有任务功能,工作人员仍将使用其内存中的副本,就像读取它们时一样。
2013年

1
注意:您可以运行以下命令来验证是否已注册您的任务celery inspect registered
Nick Brady

1
您也可以使用选项启动celery,该选项--autoreload将在每次更改代码时重新启动celery。
谢尔盖·柳普斯汀

不幸不推荐使用。:人们可以使用从该链接的解决方案avilpage.com/2017/05/...
托马斯Szkudlarek

50

我遇到了同样的问题:原因"Received unregistered task of type.."是celeryd服务在服务启动时找不到并注册了任务(顺便说一下,当您启动时,它们的列表是可见的 ./manage.py celeryd --loglevel=info)。

这些任务应CELERY_IMPORTS = ("tasks", )在设置文件中声明。
如果您有特殊celery_settings.py文件,则必须按照digivampire的说明在celeryd服务启动时声明它--settings=celery_settings.py


1
谢谢,实际上是有问题的,因为我是使用〜/ path / to / celery / celeryd而不是manage.py命令来启动celery的!
Antoine 2014年

27

无论您使用CELERY_IMPORTS还是autodiscover_tasks,重要的一点是都能找到任务,并且在Celery中注册的任务名称应与工作人员尝试获取的名称相匹配。

启动Celery时,说celery worker -A project --loglevel=DEBUG,您应该看到任务的名称。例如,如果我有一个debug_task任务celery.py

[tasks]
. project.celery.debug_task
. celery.backend_cleanup
. celery.chain
. celery.chord
. celery.chord_unlock
. celery.chunks
. celery.group
. celery.map
. celery.starmap

如果不能在列表中看到您的任务,请正确地检查你的芹菜配置进口的任务,无论是在--setting--configceleryconfigconfig_from_object

如果您正在使用celery beat,请确保task您使用的任务名称CELERYBEAT_SCHEDULE与celery任务列表中的名称匹配。


这非常有帮助。任务需求名称匹配的“任务”的关键在你的CELERYBEAT_SCHEDULE
ss_millionaire

*重要的一点是可以找到任务,并且在Celery中注册的任务名称应与工作人员尝试获取的名称相匹配。* 好点子!!!
Light.G

这是正确的答案。BEAT_SCHEDULER中的任务名称应与自动发现任务列表上显示的名称匹配。因此,如果您使用过,@task(name='check_periodically')那么它应该与您在节拍时间表中输入的内容相符,即IE:CELERY_BEAT_SCHEDULE = { 'check_periodically': { 'task': 'check_periodically', 'schedule': timedelta(seconds=1) }
Mormoran


12
app = Celery('proj',
             broker='amqp://',
             backend='amqp://',
             include=['proj.tasks'])

请包括= ['proj.tasks'] 您需要转到顶部目录,然后执行此

celery -A app.celery_module.celeryapp worker --loglevel=info

celery -A celeryapp worker --loglevel=info

在您的celeryconfig.py中,输入imports =(“” path.ptah.tasks“,)

请在其他模块中调用任务!


1
includePARAM需要,如果你使用相对进口是补充。我已经通过添加解决了它的问题
CK.Nguyen

1
投票给你这个字符串答案please in other module invoke task!!!!!!!!。它有帮助。
VolArt

8

使用--settings对我不起作用。我必须使用以下内容才能使其全部正常工作:

celery --config=celeryconfig --loglevel=INFO

这是添加了CELERY_IMPORTS的celeryconfig文件:

# Celery configuration file
BROKER_URL = 'amqp://'
CELERY_RESULT_BACKEND = 'amqp://'

CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TIMEZONE = 'America/Los_Angeles'
CELERY_ENABLE_UTC = True

CELERY_IMPORTS = ("tasks",)

我的设置有些棘手,因为我正在使用主管将celery作为守护程序启动。


8

对我来说,此错误是通过确保包含任务的应用程序包含在django的INSTALLED_APPS设置下解决的。


此外,还需要可以从<app> /tasks.py
np8 '17

3

当我在django应用程序中添加一些信号处理后,我就神秘地出现了这个问题。为此,我将应用程序转换为使用AppConfig,这意味着它不是简单地读取为'bookingin INSTALLED_APPS而是读取'booking.app.BookingConfig'

Celery不明白这意味着什么,所以我将其添加INSTALLED_APPS_WITH_APPCONFIGS = ('booking',)到django设置中,并celery.py

app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

app.autodiscover_tasks(
    lambda: settings.INSTALLED_APPS + settings.INSTALLED_APPS_WITH_APPCONFIGS
)

3

对我有用的是在celery任务装饰器中添加显式名称。我将任务声明从更改@app.tasks@app.tasks(name='module.submodule.task')

这是一个例子

# test_task.py
@celery.task
def test_task():
    print("Celery Task  !!!!")

# test_task.py
@celery.task(name='tasks.test.test_task')
def test_task():
    print("Celery Task  !!!!")

2

我在Celery Beat中执行任务时遇到了同样的问题。Celery不喜欢相对导入,因此在我的中celeryconfig.py,我必须显式设置完整的软件包名称:

app.conf.beat_schedule = {
   'add-every-30-seconds': {
        'task': 'full.path.to.add',
        'schedule': 30.0,
        'args': (16, 16)
    },
}

我希望celery文档中有更多具有完整软件包名称的示例。在看到此答案中的full.path.to.add之后,我发现我不需要导入。我知道解决方案很简单,只需要有一个更好的app.conf.beat_schedule示例即可。
zerocog

2

奇怪的是,这也可能是因为缺少软件包。运行pip安装所有必需的软件包: pip install -r requirements.txt

autodiscover_tasks 没有选择使用丢失软件包的任务。


1
我有一个类似的问题。我认为在导入期间发生的异常是导致自动发现部分无法完成的异常。
蒂姆·迪斯达尔

是的,很有道理。谢谢
kakoma '18

1

我对Django没有任何问题。但是当我使用Flask时遇到了这个问题。解决方案是设置config选项。

celery worker -A app.celery --loglevel=DEBUG --config=settings

在使用Django时,我只有:

python manage.py celery worker -c 2 --loglevel=info


1

我也遇到了这个问题,但不是完全一样,所以仅供参考。由于这种装饰器语法,最近的升级导致此错误消息。

ERROR/MainProcess] Received unregistered task of type 'my_server_check'.

@task('my_server_check')

不得不改变为公正

@task()

不知道为什么。


1

如果您在这样的已安装应用程序中使用应用程序配置:

LOCAL_APPS = [
'apps.myapp.apps.MyAppConfig']

然后在您的配置应用程序中,以如下所示的ready方法导入任务:

from django.apps import AppConfig

class MyAppConfig(AppConfig):
    name = 'apps.myapp'

    def ready(self):
        try:
            import apps.myapp.signals  # noqa F401
            import apps.myapp.tasks
        except ImportError:
            pass

0

如果遇到这种错误,可能有多种原因,但是我发现的解决方案是将/ etc / defaults / celeryd中的celeryd配置文件配置为标准用途,而不是为特定的django项目配置。我将其转换为celery docs中指定的格式后,一切都很好。


0

我将此行添加到/ etc / default / celeryd的解决方案

CELERYD_OPTS="-A tasks"

因为当我运行这些命令时:

celery worker --loglevel=INFO
celery worker -A tasks --loglevel=INFO

只有后一个命令才显示任务名称。

我也尝试过添加CELERY_APP行/ etc / default / celeryd,但这还是没有用。

CELERY_APP="tasks"

0

我在django-celery中遇到了PeriodicTask类的问题,而在启动每次执行时触发的celery worker时,它们的名称都很好显示:

KeyError:u'my_app.tasks.run'

我的任务是一个名为“ CleanUp”的类,而不仅仅是一个名为“ run”的方法。

当我检查表'djcelery_periodictask'时,我看到过时的条目并将其删除解决了该问题。


0

只是为了给我的案件加上两美分这个错误...

我的路径/vagrant/devops/testapp.py__init__.py它。

当我运行cd /vagrant/devops/ && celery worker -A test.app.celery --loglevel=info时,出现此错误。

但是当我运行它时,cd /vagrant/devops/test && celery worker -A app.celery --loglevel=info一切都很好。


0

我发现我们的一位程序员在其中一项导入中添加了以下行:

os.chdir(<path_to_a_local_folder>)

这导致Celery worker将其工作目录从项目的默认工作目录(可以在其中找到任务)更改为另一个目录(在该目录中找不到任务)。

删除此行代码后,找到并注册了所有任务。


0

Celery不支持相对导入,因此在我的celeryconfig.py中,您需要绝对导入。

CELERYBEAT_SCHEDULE = {
        'add_num': {
            'task': 'app.tasks.add_num.add_nums',
            'schedule': timedelta(seconds=10),
            'args': (1, 2)
        }
}

0

一个非常有用的列表的附加项。

我发现Celery对于任务中的错误(或至少我无法跟踪适当的日志条目)感到宽容,并且没有注册它们。我在将Celery作为服务运行时遇到了许多问题,这些问题主要与权限相关。

最新的内容与写入日志文件的权限有关。在命令行上开发或运行celery时都没有问题,但是该服务报告该任务未注册。

我需要更改日志文件夹权限以使服务能够对其进行写入。


0

我的2美分

我在使用alpine的docker映像中得到了这个。参考的django设置/dev/log记录到syslog。django应用程序和芹菜工作者都基于同一图像。django应用程序映像的入口点是在启动syslogd时启动的,但芹菜工人的入口点却没有启动。这导致事情./manage.py shell失败了,因为不会发生任何事情/dev/log。芹菜工人没有失败。相反,它只是默默地忽略了其余的应用程序启动,其中包括shared_task从Django项目中的应用程序中加载条目


0

在我的情况下,错误是因为一个容器在一个文件夹中创建了文件,这些文件已通过docker-compose安装在主机文件系统上。

我只需要删除主机系统上容器创建的文件,就可以再次启动项目。

sudo rm -Rf文件夹名称

(我必须使用sudo,因为文件由root用户拥有)

Docker版本:18.03.1


0

如果您使用autodiscover_tasks,请确保您functions要注册的文件保留在中tasks.py,而不是其他任何文件中。或芹菜找不到functions您要注册的。

使用app.register_task也可以完成这项工作,但似乎有些幼稚。

请参阅的官方规范autodiscover_tasks

def autodiscover_tasks(self, packages=None, related_name='tasks', force=False):
    """Auto-discover task modules.

    Searches a list of packages for a "tasks.py" module (or use
    related_name argument).

    If the name is empty, this will be delegated to fix-ups (e.g., Django).

    For example if you have a directory layout like this:

    .. code-block:: text

        foo/__init__.py
           tasks.py
           models.py

        bar/__init__.py
            tasks.py
            models.py

        baz/__init__.py
            models.py

    Then calling ``app.autodiscover_tasks(['foo', bar', 'baz'])`` will
    result in the modules ``foo.tasks`` and ``bar.tasks`` being imported.

    Arguments:
        packages (List[str]): List of packages to search.
            This argument may also be a callable, in which case the
            value returned is used (for lazy evaluation).
        related_name (str): The name of the module to find.  Defaults
            to "tasks": meaning "look for 'module.tasks' for every
            module in ``packages``."
        force (bool): By default this call is lazy so that the actual
            auto-discovery won't happen until an application imports
            the default modules.  Forcing will cause the auto-discovery
            to happen immediately.
    """

0

将正确的路径写入文件任务

app.conf.beat_schedule = {
'send-task': {
    'task': 'appdir.tasks.testapp',
    'schedule': crontab(minute='*/5'),  
},

}


0

当使用“ celery -A conf worker -l info”命令运行celery时,所有任务都会像我以前那样在日志中列出。conf.celery.debug_task我收到错误,因为我没有给出确切的任务路径。因此,请通过复制并粘贴确切的任务ID重新检查此内容。


0
app = Celery(__name__, broker=app.config['CELERY_BROKER'], 
backend=app.config['CELERY_BACKEND'], include=['util.xxxx', 'util.yyyy'])

0

问题的答案在于问题提供的输出的第一行: /usr/local/lib/python2.7/dist-packages/celery/loaders/default.py:64: NotConfigured: No 'celeryconfig' module found! Please make sure it exists and is available to Python. "is available to Python." % (configname, )))。如果没有正确的配置,Celery将无法执行任何操作。

无法找到celeryconfig的原因很可能是它不在您的PYTHONPATH中。


0

我已经解决了我的问题,当我退出此程序包并运行命令时,我的“任务”位于名为“ celery_task”的python程序包下celery worker -A celery_task.task --loglevel=info。有用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.