为什么Celery任务不能异步工作?

时间:2019-09-04 14:26:39

标签: django celery

我正在尝试从celery异步运行基本debug_task,但它总是同步运行。

我用django-cookiecutter模板创建了一个新项目。

我确保redis正常工作,并且所有env变量均有效。

我启动celery,并准备好接收任务时,我启动控制台(shell_plus)并异步调用任务。

In [1]: from project.taskapp.celery import debug_task                                                                                                                                                                           

In [2]: debug_task.delay()                                                                                                                                                                                                     
Request: <Context: {'id': '87b4d96e-9708-4ab2-873e-0118b30f7a6b', 'retries': 0, 'is_eager': True, 'logfile': None, 'loglevel': 0, 'hostname': 'hostname', 'callbacks': None, 'errbacks': None, 'headers': None, 'delivery_info': {'is_eager': True}, 'args': (), 'called_directly': False, 'kwargs': {}}>
Out[2]: <EagerResult: 87b4d96e-9708-4ab2-873e-0118b30f7a6b>

如您所见,参数is_eager == True->因此它可以同步。 我也尝试将任务称为debug_task.apply_async()

这里是从cookiecutter模板设置的芹菜:


import os
from celery import Celery
from django.apps import apps, AppConfig
from django.conf import settings


if not settings.configured:
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings.local')  


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


class CeleryAppConfig(AppConfig):
    name = 'project.taskapp'
    verbose_name = 'Celery Config'

    def ready(self):
        installed_apps = [app_config.name for app_config in apps.get_app_configs()]
        app.autodiscover_tasks(lambda: installed_apps, force=True)


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

1 个答案:

答案 0 :(得分:0)

许多评论者指出:配置芹菜时,请关闭急切处理:

app = Celery('project')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.conf.task_always_eager = False