芹菜收到未注册的任务types(运行示例)
我想从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
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
在芹菜服务器上的错误
[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'
请解释有什么问题。
您可以在celery.registry.TaskRegistry
类中看到注册任务的当前列表。 可能是因为你的celeryconfig(在当前目录中)不在PYTHONPATH
所以芹菜找不到它并回退到默认值。 启动芹菜时只需明确指定。
celeryd --loglevel=INFO --settings=celeryconfig
你也可以设置--loglevel=DEBUG
,你应该马上看到问题。
我有同样的问题: "Received unregistered task of type.."
是芹菜服务没有find并注册服务启动任务(顺便说一句,他们的列表是可见的,当你开始./manage.py celeryd --loglevel=info
)。
这些任务应该在设置文件中的CELERY_IMPORTS = ("tasks", )
中声明。
如果你有一个特殊的celery_settings.py
文件,它必须在celeryd服务上声明为--settings=celery_settings.py
就像digivampire写的那样。
我认为你需要重新启动工作服务器。 我遇到同样的问题,并通过重新启动解决它。
我也有同样的问题; 我补充说
CELERY_IMPORTS=("mytasks")
在我的celeryconfig.py
文件中解决它。
无论您使用CELERY_IMPORTS
还是使用autodiscover_tasks
,重要的一点是可以find任务,并且在Celery中注册的任务名称应该与工作人员试图获取的名称相匹配。
当你启动芹菜,说celery worker -A project --loglevel=DEBUG
,你应该看到任务的名称。 例如,如果我在我的celery.py
有一个debug_task
任务。
[tasks] . project.celery.debug_task . celery.backend_cleanup . celery.chain . celery.chord . celery.chord_unlock . celery.chunks . celery.group . celery.map . celery.starmap
如果在列表中看不到您的任务,请检查您的celeryconfiguration是否正确导入任务,无论是在--setting
,– celeryconfig
, celeryconfig
还是config_from_object
。
如果您使用的是芹菜节拍,请确保您在CELERYBEAT_SCHEDULE
中使用的任务名称, task
与芹菜任务列表中的名称匹配。
对我来说,这个错误是通过确保包含任务的应用程序包含在django的INSTALLED_APPS设置下来解决的。
使用 – 设置不适合我。 我不得不使用以下来完成这一切工作:
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",)
我的设置有点棘手,因为我使用pipe理员来启动芹菜作为守护进程。
从Celery Beat运行任务时,我遇到了同样的问题。 芹菜不喜欢相关的import,所以在我的celeryconfig.py
,我不得不明确设置完整的包名称:
app.conf.beat_schedule = { 'add-every-30-seconds': { 'task': 'full.path.to.add', 'schedule': 30.0, 'args': (16, 16) }, }
如果你遇到这种错误,有很多可能的原因,但是我发现的解决scheme是我的/ etc / defaults / celeryd中的configuration文件被configuration为标准使用,而不是我特定的django项目。 只要我把它转换成芹菜文档中指定的格式,一切都很好。
我的解决scheme是将这一行添加到/ 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"
我也遇到了这个问题,但是不完全相同,所以只是FYI。 由于这个装饰器语法,最近的升级导致这个错误信息。
ERROR / MainProcess]接收到types为“my_server_check”的未注册任务。
@task( 'my_server_check')
只好改变
@任务()
不知道为什么。
我在django-celery的PeriodicTask类中遇到了这个问题,而在启动芹菜工作的时候,
KeyError:u'my_app.tasks.run'
我的任务是一个名为“CleanUp”的类,而不仅仅是一个名为“run”的方法。
当我检查表'djcelery_periodictask'时,我看到过时的条目,删除它们解决了问题。
当我添加一些信号处理到我的Django应用程序时,我有这个问题神秘地出现了。 在这样做的过程中,我将应用程序转换为使用AppConfig,这意味着不是简单地在INSTALLED_APPS
读取'booking.app.BookingConfig'
,而是读取'booking.app.BookingConfig'
。
芹菜不明白这是什么意思,所以我补充说, 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 )
只是为了增加我的两个美分我的情况下,这个错误…
我的path是/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
一切正常。
我发现我们的程序员之一将以下行添加到其中一个导入:
os.chdir(<path_to_a_local_folder>)
这导致芹菜工作者将其工作目录从项目的默认工作目录(它可以find任务)改变到不同的目录(在其中找不到任务)。
删除这行代码后,所有的任务被发现并注册。
我的芹菜版本是4.0.2 (latentcall)
。 我正在使用autodiscover_tasks()
。 我有同样的问题,因为我没有激活我的python环境。
希望这可能有帮助。
Celery不支持相对的导入,所以在我的celeryconfig.py中,你需要绝对导入。
CELERYBEAT_SCHEDULE = { 'add_num': { 'task': 'app.tasks.add_num.add_nums', 'schedule': timedelta(seconds=10), 'args': (1, 2) } }