我找到了这个question并尝试了所有建议以及接受的答案。仍然没有运气。
这是我的mysite/taskapp/celery.py
:
import os
from celery import Celery
from django.apps import AppConfig
from django.conf import settings
if not settings.configured:
# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings.local') # pragma: no cover
app = Celery('mysite')
class CeleryConfig(AppConfig):
name = 'mysite.taskapp'
verbose_name = 'Celery Config'
def ready(self):
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()
@app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self.request)) # pragma: no cover
这是我的谜__init__.py
:
from mysite.taskapp.celery import app as celery_app
__all__ = ['celery_app']
以下是mysite/myapp/tasks.py
示例:
from celery import shared_task
@shared_task
def mytask():
print('Do something')
当使用celery -A mysite worker -l info
运行芹菜工作者时,输出是
celery@tim-office v4.1.0 (latentcall)
Darwin-16.7.0-x86_64-i386-64bit 2018-02-27 21:38:55
[config]
.> app: mysite:0x1058e0fd0
.> transport: amqp://guest:**@localhost:5672//
.> results: disabled://
.> concurrency: 4 (prefork)
.> task events: OFF (enable -E to monitor tasks in this worker)
[queues]
.> celery exchange=celery(direct) key=celery
[tasks]
. mysite.taskapp.celery.debug_task
请注意,找不到mysite/myapp/tasks.py
个任务。在设置文件中将应用添加到CELERY_IMPORTS
,我一直在旋转轮子一整天尝试各种各样的事情:
CELERY_IMPORTS = ('myapp.tasks',)
试图强迫他们进入autodiscover_tasks line in the above
mysite / taskapp / celery.py`:
app.autodiscover_tasks(['myapp',])
我在哪里错了?非常感谢任何帮助。
更新:可能值得注意的是我正在使用cookiecutter-django的项目结构。
答案 0 :(得分:1)
我有同样的问题,但既然我安全地解决了它,我会回应。 我的环境如下。
首先,我将向您展示示例代码。 (对不起,语言是日语。
让Django识别任务的要点如下:
为了让服务器识别任务,app.autodiscover_tasks ()
仅在加载settings.py
指定的DJANGO_SETTINGS_MODULE
时被调用一次。它不需要在其他子应用程序上调用。
启动worker和scheduler时,请指定DJANGO_SETTINGS_MODULE
。
# Server
python3 manage.py runserver 0.0.0.0:8000
# Worker
DJANGO_SETTINGS_MODULE=tm.settings celery -A tm worker
# Scheduler
DJANGO_SETTINGS_MODULE=tm.settings celery -A tm beat --scheduler django_celery_beat.schedulers:DatabaseScheduler
有了这两个,Django方面应该认识到这个任务。有关详细信息,请参阅示例代码。
参考文献:
答案 1 :(得分:0)
我会评论,但不会有50个声誉。
您是否有日志设置?如果是这样,暂时禁用日志记录并尝试再次启动芹菜。
当Django启动时,可能存在未被捕获的错误。在我的情况下,芹菜没有对日志文件的正确权限。
答案 2 :(得分:0)
使用Django 2和Celery 4.1时,我遇到了相同/类似的问题。似乎AppConfig
混淆了Celery的一些自动配置。我找到了两个解决方案:
settings.INSTALLED_APPS
传递给app.autodiscover_tasks
函数。这可能会使其他事情变得混乱,但还没有碰到它这是我的<project_name>/<project_name>/celery.py
文件:
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', '<project_name>.settings')
app = Celery('<project_name>')
# Using a string here means the worker doesn't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
# should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings', namespace='CELERY')
# Load task modules from all registered Django app configs.
app.autodiscover_tasks()
if __name__ == '__main__':
app.start()
@app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self.request))
我的__init__.py
和<project_name>/<app_name>/tasks.py
设置与您的相同。