celery - 尽管已注册,但任务未运行。芹菜控制台不反映任务的接收

Posted

技术标签:

【中文标题】celery - 尽管已注册,但任务未运行。芹菜控制台不反映任务的接收【英文标题】:celery - Task is not running despite being registered. Celery console does not reflect reception of task 【发布时间】:2020-07-21 06:21:40 【问题描述】:

在同一问题上查看了许多线程后,我还没有找到答案。

我正在运行一个带有以下内容的 Django 应用程序

Python:3.6

Django:3.0.5

芹菜:4.0.2

昆布:4.2.0

我正在使用 docker-compose 运行所有堆栈,而 celery 正在另一个容器中运行。 显然我的任务是在 celery 中注册,因为如果我检查我的应用程序的注册任务,我会得到一个包含单个元素的列表,即任务本身:

$ celery -A apps.meals.tasks inspect registered
-> celery@7de3143ddcb2: OK
    * apps.meals.tasks.send_slack_notification

myproj/settings.py

INSTALLED_APPS = [
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'apps',
    'apps.meals',
]

myproj/celery.py:

from __future__ import absolute_import, unicode_literals
from celery import Celery
import os
from django.conf import settings

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproj.settings')

app = Celery('myproj')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()

app.conf.update(
    BROKER_URL=settings.BROKER_URL,
)

我的任务在另一个地方,在 meals 应用程序中,在一个名为 tasks.py 的文件中。

apps/meals/tasks.py

from django.conf import settings
from slackclient import SlackClient
from celery.utils.log import get_task_logger
from myproj import celery_app
from json import loads, dumps

logger = get_task_logger(__name__)


slack_markdown_text = "Hola!\n El menu de hoy es:\n content\n Pueden enviar su pedido aca: link\n Saludos!"


@celery_app.task(name="apps.meals.tasks.send_slack_notification")
def send_slack_notification(serial_menu, serial_options):
  ...

我的文件结构是这样的:

technical-tests/
|
|--apps/
|----*snap
|----meals/
|------*snap
|------tasks.py
|--myproj
|----*snap
|----celery.py
|----settings.py

最后,docker-compose.yml 是这样的:

version: '3.5'

services:
   backend: ....
   celery:
       build: 
         context: ..
         dockerfile: ./deploy/Dockerfile
       volumes:
         - ../code/:/opt/somelocation
       environment:
         - SECRET_KEY
         - SLACK_TOKEN
         - SLACK_CHANNEL
         - SLACK_URL_PATTERN
         - BROKER_URL
       command: celery -A apps.meals.tasks worker -l info
       depends_on: 
         - backend
         - redis

Celery 工人控制台

当注册的任务出现时,Celery 控制台启动时没有显示漂亮的彩色屏幕,所以这很可疑。它只显示:

celery_1_aa9c50e916ae | /usr/local/lib/python3.6/site-packages/celery/platforms.py:796: RuntimeWarning: You're running the worker with superuser privileges: this is
celery_1_aa9c50e916ae | absolutely not recommended!
celery_1_aa9c50e916ae | 
celery_1_aa9c50e916ae | Please specify a different user using the --uid option.
celery_1_aa9c50e916ae | 
celery_1_aa9c50e916ae | User information: uid=0 euid=0 gid=0 egid=0
celery_1_aa9c50e916ae | 
celery_1_aa9c50e916ae |   uid=uid, euid=euid, gid=gid, egid=egid,
celery_1_aa9c50e916ae | [2020-04-08 14:05:34,024: INFO/MainProcess] Connected to redis://redis:6379/0
celery_1_aa9c50e916ae | [2020-04-08 14:05:34,034: INFO/MainProcess] mingle: searching for neighbors
celery_1_aa9c50e916ae | [2020-04-08 14:05:35,053: INFO/MainProcess] mingle: all alone
celery_1_aa9c50e916ae | [2020-04-08 14:05:35,068: WARNING/MainProcess] /usr/local/lib/python3.6/site-packages/celery/fixups/django.py:200: UserWarning: Using settings.DEBUG leads to a memory leak, never use this setting in production environments!
celery_1_aa9c50e916ae |   warnings.warn('Using settings.DEBUG leads to a memory leak, never '
celery_1_aa9c50e916ae | [2020-04-08 14:05:35,069: INFO/MainProcess] celery@7de3143ddcb2 ready.

我知道任务没有运行,因为在 python shell 中,当我调用 send_slack_notifications without delay 它会立即运行,但是当我使用 delay 时,命令会永远挂起并且 celery 控制台不动,就像它没有收到任何信息一样。

非常感谢任何见解!

更新

delay 正在调用apps/meals/views.py

from apps.meals.tasks import send_slack_notification

@login_required
def notify_menu(request, uuid):
    if is_staff(request.user):
        menu = Menu.objects.filter(uuid=uuid)
        send_slack_notification.delay(
            serialize(menu),
            serialize(menu.first().list_options())
        )

【问题讨论】:

请包含您用于触发任务的代码以及工作人员的完整输出。 嘿@schillingt 我已经添加了调用任务的视图函数。作为完整的输出,它已经发布了。就是这样。 通常有更多的 celery worker 实例化输出指示所涉及的队列和交换。 您是否尝试过创建一个简单的add 任务,该任务需要两个整数来查看它是否运行? @schillingt 是的,我看到了。我终于用 Django 应用程序恢复了一些文件夹结构更改,它似乎又可以工作了。 【参考方案1】:
    在您的 celery 配置中,添加环境变量 C_FORCE_ROOT,其值为 1。 在 django 设置中使用 CELERY_BROKER_URL 从设置中正确设置 celery 代理,不要从环境中传入 BROKER_URL(celery 会混淆,因为环境变量可能会覆盖设置变量。 不要使用app.conf.update 设置BROKER_URL,使用上面讨论的设置CELERY_BROKER_URL

【讨论】:

以上是关于celery - 尽管已注册,但任务未运行。芹菜控制台不反映任务的接收的主要内容,如果未能解决你的问题,请参考以下文章

Celery 注册了任务,但 beat 没有从已安装的应用程序中安排任务

芹菜任务未处理

为啥创建了芹菜任务但未收到

尽管队列看起来是空的,但 Celery Redis 实例已满

芹菜任务未显示在 Django Admin 中

芹菜节拍不接周期性任务