Django 处理 运行 个任务而不是 Celery

Django process running tasks instead of Celery

我是 运行 一个使用 Celery+redis 来处理异步任务的应用程序。 我设法让芹菜看到任务列表。但是,我的任务不是由 Celery worker 执行的,而是由 Django 进程执行的。

我尝试用 .delay().apply_async() 调用任务但没有成功(实际上在这些情况下,对任务的调用被无限期地阻止并且日志中没有显示任何内容)。
我可能遗漏了一些非常基本的东西,但看不到在哪里。

相关设置如下:

settings.py

CELERY_REDIS_DB = os.environ.get("REDIS_DB_CELERY", 0)
CELERY_REDIS_HOST = os.getenv("REDIS_HOSTNAME", "redis")
CELERY_REDIS_PORT = 6379
CELERY_RESULT_BACKEND = BROKER_URL = (
    f'redis://{CELERY_REDIS_HOST}:{CELERY_REDIS_PORT}/{CELERY_REDIS_DB}'
)
CELERY_TIMEZONE = TIME_ZONE
CELERY_RESULT_EXPIRES = 5 * 60 * 60

celery.py

from celery import Celery

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'maat.settings')
app = Celery('maat')

# Using a string here means the worker don'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()

tasks.py

@shared_task
def remove_task(
    environment=None,
    payload=None,
    **kwargs,
):
    LOGGER.info('Received task, now removing')
    ...

views.py

class MyClass(
    LoginRequiredMixin,
    PermissionRequiredMixin,
    SingleObjectMixin,
    APIView
):
    return_403 = True
    model = models.Environment
    slug_field = 'name'
    slug_url_kwarg = 'environment'

    def delete(self, request, environment):
        tasks.remove_task(environment=environment, payload=request.data)

假设 celery.py 居住在 views.py 可以访问的地方,问题很可能是因为您正在使用共享任务,django 在没有更多信息的情况下不知道如何与 celery broker 通信.

为此,我们可以 follow the advice from our helpful friends at stack overflow 并在您看来执行类似以下操作:

from path.to.celery import app
app.set_default()