Celery .delay()同步工作,不延迟

时间:2019-01-06 14:38:28

标签: python django asynchronous rabbitmq celery

我有一个带有Celery背景和定期任务的Django项目。一年前,我开始了工作流程,并且定期工作很好。但是,我刚刚发现调用异步函数主服务器代码不起作用,apply_async() / delay()导致函数的同步执行,就像不使用它们一样。我该如何解决这个问题?我的芹菜版本是4.2。这是我的芹菜设置文件:

import os
from celery import Celery
from django.conf import settings

broker_url = 'amqp://<user>:<password>@localhost:5672/{project}'
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'MyProject.settings')

app = Celery('<project>', broker=broker_url)

app.config_from_object('django.conf:settings')
app.conf.update (
    CELERY_TASK_SERIALIZER='json',
    CELERY_ACCEPT_CONTENT=['json'],
    CELERY_RESULT_SERIALIZER='json',
    CELERYD_HIJACK_ROOT_LOGGER=False,
    BROKER_URL=broker_url,
    CELERY_RESULT_BACKEND='djcelery.backends.database.DatabaseBackend',
    CELERY_ALWAYS_EAGER=True,
)

这是我的测试代码:

from general.celery import app
from time import sleep

@app.task
def fun():
    for i in range(5):
        print('Sleeping')
        sleep(2)
    print('Awake')

def test():
    print('Begin')
    fun.apply_async(countdown=10)
    print('End')

它导致立即输出:

Begin
Sleeping
...

我还检查了芹菜的inspect

from celery.task.control import inspect
print(inspect().stats())

它描述了以下状态:

{
    'broker': {
        'failover_strategy': 'round-robin',
        'ssl': False,
        'transport': 'amqp',
        'heartbeat': 120.0,
        'transport_options': {},
        'insist': False,
        'alternates': [],
        'connect_timeout': 4,
        'userid': '<user>',
        'hostname': '127.0.0.1',
        'login_method': 'AMQPLAIN',
        'port': 5672,
        'uri_prefix': None,
        'virtual_host': '<project>'
    },
    'total': {},
    'prefetch_count': 8,
    'clock': '2299',
    'pool': {
        'put-guarded-by-semaphore': False,
        'max-concurrency': 2,
        'max-tasks-per-child': 'N/A',
        'writes': {
            'avg': '0.00%',
            'inqueues': {
                'total': 2,
                'active': 0
            },
            'total': 0,
            'raw': '',
            'all': '',
            'strategy': None
        },
        'timeouts': [0, 0],
        'processes': [28728, 28729]
    },
    'pid': 28722,
    'rusage': {
        'stime': 0.3959,
        'idrss': 0,
        'maxrss': 57220,
        'inblock': 2552,
        'minflt': 24279,
        'majflt': 3,
        'msgsnd': 0,
        'ixrss': 0,
        'nswap': 0,
        'nivcsw': 31,
        'isrss': 0,
        'nvcsw': 3326,
        'utime': 2.492,
        'msgrcv': 0,
        'nsignals': 0,
        'oublock': 0
    }
}

1 个答案:

答案 0 :(得分:2)

您在CELERY_ALWAYS_EAGER=True调用中明确设置了app.conf.update()docs for 3.1),因此Celery以同步模式执行。

不推荐使用它,并将其重命名为task_always_eagerdocs for latest 4.2),但您的Celery v4.2仍然可以识别它