【问题标题】:Celery .delay() works synchronously, not delayingCelery .delay() 同步工作,不延迟
【发布时间】:2019-06-01 10:05:51
【问题描述】:

我有一个具有 Celery 背景和定期任务的 Django 项目。我一年前开始工作进程,定期任务运行良好。但是,我刚刚发现调用异步函数主服务器代码不起作用,apply_async()/delay() 导致函数的同步执行就像不使用它们一样。我该如何解决这个问题?我的 Celery 版本是 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
...

我还查看了 Celery 的 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
    }
}

【问题讨论】:

    标签: python django asynchronous rabbitmq celery


    【解决方案1】:

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

    它已被弃用并重命名为 task_always_eager (docs for latest 4.2) 但仍可能被您的 Celery v4.2 识别

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-29
      • 2011-08-06
      • 1970-01-01
      • 1970-01-01
      • 2012-08-10
      • 1970-01-01
      • 2011-02-17
      • 1970-01-01
      相关资源
      最近更新 更多