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

时间:2012-03-19 11:40:51

标签: python celery

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

我跑: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

tasks.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'

请解释问题所在。

38 个答案:

答案 0 :(得分:46)

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

答案 1 :(得分:46)

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

这些任务应在设置文件的CELERY_IMPORTS = ("tasks", )中声明 如果您有一个特殊的celery_settings.py文件,则必须在cevicd service start上声明为--settings=celery_settings.py,如digivampire所写。

答案 2 :(得分:43)

您可以在celery.registry.TaskRegistry课程中查看已注册任务的当前列表。可能是你的celeryconfig(在当前目录中)不在PYTHONPATH中,所以芹菜找不到它并且回退到默认值。只需在启动芹菜时明确指定它。

celeryd --loglevel=INFO --settings=celeryconfig

您也可以设置--loglevel=DEBUG,您应该立即看到问题。

答案 3 :(得分:20)

无论您使用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与芹菜任务列表中的名称相匹配。

答案 4 :(得分:13)

我也有同样的问题;我添加了

CELERY_IMPORTS=("mytasks")

在我的celeryconfig.py文件中解决它。

答案 5 :(得分:8)

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

答案 6 :(得分:7)

使用--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作为守护进程启动。

答案 7 :(得分:5)

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”,)

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

答案 8 :(得分:3)

就我而言,问题是我的项目没有正确接收 autodiscover_tasks

celery.py 文件中,用于获取 autodiscover_tasks 的代码是:

app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

我把它改成了下面的:

from django.apps import apps
app.autodiscover_tasks(lambda: [n.name for n in apps.get_app_configs()])

祝你好运。

答案 9 :(得分: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)
    },
}

答案 10 :(得分:2)

奇怪的是,这也可能是由于缺少软件包造成的。运行pip安装所有必需的软件包: autodiscover_tasks

SpriteStuff未选择使用丢失软件包的任务。

答案 11 :(得分:2)

对我有用的是为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  !!!!")

答案 12 :(得分:2)

尝试在Python Shell中导入Celery任务-Celery可能由于错误的import语句而无声地无法注册您的任务。

我的task.py文件中有一个ImportError异常,这导致Celery未在模块中注册任务。所有其他模块任务均已正确注册。

直到我尝试在Python Shell中导入Celery任务时,该错误才变得明显。我修复了错误的导入语句,然后任务已成功注册。

答案 13 :(得分:2)

当我向我的django应用程序添加一些信号处理时,我有这个问题神秘地突然出现。在这样做的过程中,我将应用程序转换为使用AppConfig,这意味着不仅仅是阅读'booking'在INSTALLED_APPS中,它显示为'booking.app.BookingConfig'

芹菜不明白这意味着什么,所以我在我的django设置中添加了INSTALLED_APPS_WITH_APPCONFIGS = ('booking',),并修改了我的celery.py

app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

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

答案 14 :(得分:1)

您是否包含了task.py文件或异步方法存储在何处?

app = Celery('APP_NAME', broker='redis://redis:6379/0', include=['app1.tasks', 'app2.tasks', ...])

答案 15 :(得分:1)

正如其他答案所指出的那样,芹菜会默默地忽略任务的原因有很多,包括依赖性问题以及任何语法或代码问题。

找到它们的一种快速方法是运行:

./manage.py check

很多时候,修复报告的错误后,芹菜可以识别任务。

答案 16 :(得分:1)

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

ngOnDestroy

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

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

答案 17 :(得分:1)

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

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

与Django一起,我只是:

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

答案 18 :(得分:1)

我也遇到过这个问题,但它并不完全相同,所以只是我们。由于此装饰器语法,最近的升级会导致此错误消息。

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

@task('my_server_check')

不得不改为

@task()

不知道为什么。

答案 19 :(得分:0)

在我的例子中,错误的任务名称已经被 celery beat 持久化了......对于我来说,一切都还早。

答案 20 :(得分:0)

这解决了我的问题(把它放在你的 create_app() 函数中):

celery.conf.update(app.config)

class ContextTask(celery.Task):
    def __call__(self, *args, **kwargs):
        with app.app_context():
            return self.run(*args, **kwargs)

celery.Task = ContextTask

答案 21 :(得分:0)

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

答案 22 :(得分:0)

如果应用缺少某些依赖项,Celery将不会导入任务。例如,一个app.view导入numpy而不安装它。最好的检查方法是尝试运行django服务器,如您所知:

python manage.py runserver

如果在包含相应任务的应用程序中引发ImportErrors,则您发现了问题。只需pip安装所有内容,或尝试删除依赖项,然后重试。否则,这不是导致您出现问题的原因。

答案 23 :(得分:0)

如果您使用的是 Docker,就像上面说的@here 会消除您的痛苦。

docker stop $(docker ps -a -q)

答案 24 :(得分: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中。

答案 25 :(得分:0)

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

答案 26 :(得分:0)

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

答案 27 :(得分:0)

写出正确的文件任务路径

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

}

答案 28 :(得分: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.
    """

答案 29 :(得分:0)

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

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

  

sudo rm -Rf foldername

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

Docker版本:18.03.1

答案 30 :(得分:0)

我的2美分

我是在使用阿尔卑斯山的码头图像中得到这个。 django设置引用{{app.serveurs}}以记录到syslog。 django应用程序和芹菜工作者都基于相同的图像。 django应用程序映像的入口点在启动时启动{{app.serveurs}},但芹菜工作者的入口点却没有。这导致[Object object]之类的内容失败,因为没有任何[Object object]。芹菜工人没有失败。相反,它默默地忽略了应用程序启动的其余部分,其中包括从django项目中的应用程序加载/dev/log条目

答案 31 :(得分:0)

真正有用的列表的附加项目。

我发现Celery在任务错误方面是不可原谅的(或者至少我没有能够跟踪相应的日志条目)并且它没有注册它们。我在运行Celery作为服务方面遇到了很多问题,这些服务主要与权限相关。

与写入日志文件的权限相关的最新信息。我在开发或在命令行中运行芹菜时没有任何问题,但该服务将该任务报告为未注册。

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

答案 32 :(得分:0)

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

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

答案 33 :(得分:0)

只是为了我的情况加上我的两分钱这个错误......

我的路径为/vagrant/devops/test,其中包含app.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那样运行时,一切都还可以。

答案 34 :(得分:0)

我发现我们的程序员之一将以下行添加到其中一个导入中:

 <form runat="server" id="form1" action="Test.aspx.cs">

    <asp:TemplateField HeaderText="Add Score">
<ItemTemplate>

<asp:RadioButtonList ID="RadioButtonList1" runat="server" CssClass="cssrbt">
<asp:ListItem Text="Correct" Value="1"></asp:ListItem>
<asp:ListItem Text="Wrong" Value="2"></asp:ListItem>
</asp:RadioButtonList>


</ItemTemplate>
</asp:TemplateField>


          <asp:Button ID="btn_Submit" runat="server" class="btn btn-md btn-danger" Text="Submit" OnClientClick="return Validate('RadioButtonList1')" OnClick="btn_Submit_OnClick"  />

    </form>


    <script language="javascript" type="text/javascript">
                function Validate(id) {
                    var radiobutton = document.getElementsByName(id);
                    var flag;
                    for (var j = 0; j < radiobutton.length; j++) {
                        if (radiobutton[j].checked !== true) {
                            flag = true;
                        } else {
                            break;
                        }


                    }

                    if (flag) {
                        alert("Please select one option");
                        return false;

                    } 
                }
            </script>

这导致Celery工作人员从项目中更改其工作目录。默认工作目录(可以找到任务的地方)到另一个目录(它无法找到任务)。

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

答案 35 :(得分:0)

我在django-celery中遇到了PeriodicTask类的问题,而在每次执行触发时启动芹菜工作者时,他们的名字显示正常:

KeyError:u&#39; my_app.tasks.run&#39;

我的任务是一个名为&#39; CleanUp&#39;的课程,而不仅仅是名为&#39; run&#39;。

的方法。

当我查看表格时,djcelery_periodictask&#39;我看到过时的条目并删除它们解决了这个问题。

答案 36 :(得分: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"

答案 37 :(得分:0)

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

相关问题