Сельдерей .delay () работает синхронно, не задерживаясь - PullRequest
0 голосов
/ 06 января 2019

У меня есть проект Django с фоном Celery и периодическими заданиями. Я начал рабочий процесс год назад, и периодические задачи работают хорошо. Однако я только что обнаружил, что вызов кода основного сервера асинхронных функций не работает, apply_async() / delay() приводит к синхронному выполнению функции, как и без их использования. Как я могу решить проблему? Моя версия сельдерея 4.2. Вот мой файл настроек Celery:

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 голосов
/ 06 января 2019

вы явно задали CELERY_ALWAYS_EAGER=True ( документы для 3.1 ) в своем вызове app.conf.update(), поэтому Celery выполняется в синхронном режиме.

Это устарело и переименовано в task_always_eager ( документы для последних 4.2 ), но все еще может быть распознано вашим Celery v4.2

...