我找到了这个问题,并尝试了所有建议以及接受的答案。仍然没有运气。
这是我的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
这是我的MySite的__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的项目结构。
我会发表评论,但没有50个声誉。
您有记录设置吗?如果是这样,请暂时禁用伐木并尝试重新开始芹菜。
当Django启动时,可能会出现错误的错误。在我的情况下,芹菜对日志文件没有正确的权限。
我遇到了同样的问题,但是由于我安全地解决了,所以我会做出回应。我的环境如下。
- Django 4.0
- 芹菜2.0
首先,我将向您展示示例代码。(对不起,语言是日语。
示例代码
使Django识别任务的要点如下。
-
为了使服务器识别任务,加载
settings.py
指定的CC_9时仅调用app.autodiscover_tasks ()
一次。它不需要在其他子应用程序上调用。 -
启动工人和调度程序时,指定
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一侧应识别任务。请参阅示例代码以获取详细信息。
参考:
- http://docs.celeryproject.org/en/latest/userguide/periodic-tasks.html
- https://github.com/celery/django-celery-beat
i使用django 2和芹菜4.1时遇到相同/一个相似的问题。看来AppConfig
用芹菜弄乱了一些自动配置。我找到了两个解决方案:
- 不要将
settings.INSTALLED_APPS
传递给app.autodiscover_tasks
功能。这可能会惹上其他事情,但还没有遇到过 - 确实将其传递给,但包括一个数组,其中只有在此处指出的应用程序名称的名称/li>
这是我的<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
的设置与您的设置相同。