我有一个带有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
}
}
答案 0 :(得分:2)
您在CELERY_ALWAYS_EAGER=True
调用中明确设置了app.conf.update()
(docs for 3.1),因此Celery以同步模式执行。
不推荐使用它,并将其重命名为task_always_eager
(docs for latest 4.2),但您的Celery v4.2仍然可以识别它