无法在 Django 中调用 Celery

Can't call Celery in Django

所以问题是,当我尝试从 Django lpr.views.py 页面调用 main 任务时,显示正在加载图标,仅此而已,没有其他任何事情发生。 Django 或 Celery 控制台中没有输出。当我尝试 运行 来自 python shell 的任务时,它 运行 没有问题并将结果保存在数据库中。我添加 add 任务用于测试目的,当我 运行 add 任务时 returns 由于缺少 'y' 参数是正常的。但是 main 任务是怎么回事?

有我的代码以防万一。

项目结构:

Project
├── acpvs
│   ├── celery.py
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── db.sqlite3
├── lpr
│   ├── __init__.py
│   ├── tasks.py
│   ├── urls.py
│   └── views.py
└── manage.py

settings.py

import djcelery

INSTALLED_APPS = [
    ...
    'djcelery',
    'django_celery_results',
]

CELERY_BROKER_URL = 'redis://localhost:6379/0'
CELERY_RESULT_BACKEND = 'django-db'
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_ACCEPT_CONTENT = ['json']
CELERY_ALWAYS_EAGER = False

djcelery.setup_loader()

init.py

from __future__ import absolute_import, unicode_literals

# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from acpvs.celery import app as celery_app

__all__ = ['celery_app']

acpvs.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', 'acpvs.settings')

app = Celery('acpvs')

# 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()


@app.task(bind=True)
def debug_task(self):
    print('Request: {0!r}'.format(self.request))

lpr.tasks.py

from __future__ import absolute_import, unicode_literals
from celery import shared_task
from djcelery import celery


@shared_task
def add(x, y):
    return x + y

@shared_task
def main():
    ...
    args = {
        'imageName': imageName,
        'flag': True
    }

    return args

lpr.urls.py

from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^t/$', views.test_add),
    url(r'^t1/$', views.test_main),
]

lpr.views.py

from . import tasks
from django.http import HttpResponse



def test_add(request):
    result = tasks.add.delay()
    return HttpResponse(result.task_id)

der test_main(request):
    result = tasks.main.delay()
    return HttpResponse(result.task_id)

更新

在我看来,我集成 Celery 的方式仍然存在问题。当我从 views.py 中删除 .delay() 时,它可以工作,但当然不是异步的,也没有使用 Celery。

delay()实际上是异步执行任务,请确认是否更新了db中的值, 我认为它会更新 db 中的值(如果 main 方法正在执行)但不会 return 值,因为客户端将消息添加到队列,然后代理会传递该值给工作人员的消息,然后工作人员执行 main

的操作

所以我通过删除所有 djcelery 实例并将 Django 从 1.11 升级到 2.0.3 来让它工作

顺便说一句,我使用的是 Celery 4.1.0