问题描述
我一直在研究两个类似的教程(和here),试图为我的Django项目创建计划任务,但是我似乎无法从Celery服务获得任何输出
我已将Celery和Redis添加到requirements.txt
。
Django==3.0.7
celery==4.4.7
redis==3.5.3
将celery,celery-beat和redis服务添加到docker-compose.yaml
。
version: "3.8"
services:
cache:
image: redis:alpine
database:
image: "postgis/postgis"
ports:
- "5432:5432"
environment:
POSTGRES_DB: postgres
POSTGRES_USER: ${DATABASE_DEFAULT_USERNAME}
POSTGRES_PASSWORD: ${DATABASE_DEFAULT_PASSWORD}
web:
build: .
ports:
- "8000:8000"
volumes:
- .:/app
depends_on:
- cache
- database
env_file:
- .env
queue:
build: .
command: celery -A api worker -l info
volumes:
- .:/app
links:
- cache
depends_on:
- cache
- database
scheduler:
build: .
command: celery -A api beat -l info
volumes:
- .:/app
links:
- cache
depends_on:
- cache
- database
import os
from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE','api.settings')
app = Celery('api')
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))
from .celery import app as celery_app
__all__ = ('celery_app',)
在api/server/tasks.py
中创建了一个任务。
import logging
from celery import shared_task
logger = logging.getLogger(__name__)
@shared_task
def sample_task():
logger.debug('The sample task just ran.')
并将以下内容添加到api/api/settings/base.py
中({{1}被导入到base.py
中)。
api/api/settings/__init__.py
CELERY_broKER_URL = 'redis://cache:6379'
CELERY_RESULT_BACKEND = 'redis://cache:6379'
CELERY_BEAT_SCHEDULE = {
'sample_task': {
'task': 'server.tasks.sample_task','schedule': crontab(),},}
服务似乎可以正常启动(输出一堆日志,以“准备接受连接”结尾),但是cache
和queue
服务似乎没有输出任何东西。当我运行scheduler
或docker-compose logs -f 'queue'
时,将得到以下输出。
docker-compose logs -f 'scheduler'
我可以从python控制台导入并运行Attaching to
作为Celery任务。
sample_task()
那么我在做什么错了?我想念什么?
更新
我取得了一些进步。我一直在PyCharm中使用docker run配置来>>> from server.tasks import sample_task
>>> sample_task()
2020-09-10 13:47:15,020 server.tasks DEBUG The sample task just ran.
>>> sample_task.delay()
<AsyncResult: 1594ed42-23d0-4302-8754-ba9097c170bd>
项目,但没有意识到它被设置为仅构建--build
服务;因此没有建立队列和调度程序服务。
在我解决此问题之后,队列和调度程序服务正在输出抱怨未设置环境变量的日志。因此,在将web
属性添加到两个服务之后,我现在可以附加到env_file
和api_queue_1
,但是仍然没有进一步的输出。
解决方法
command: celery -A api worker -l info
logger.debug('The sample task just ran.')
您看到问题了吗? ::facepalm::
我以info
日志级别运行celery,但是以debug
日志级别运行日志,因此debug
日志没有传播。
我本来以为即使在信息日志级别,我也会看到芹菜的某种输出,但我想没有。而且我仍然不确定为什么我 在docker容器的bash shell中运行celery命令时,甚至在我更改日志级别之前就看到了输出。