芹菜任务状态总是待定

Doc*_*ard 17 python django celery celery-task django-celery

我对celery和django一般都是新手,所以请原谅我缺乏知识.我正在尝试运行测试来进行一些计算并等待测试完成,这样我就能确保完成正确的答案.

这是我有的:

在app/tests.py中

from tasks import *


c = calculate.apply_async(args=[1])

# wait until the task is done
while not calculate.AsyncResult(c.id).status == "SUCCESS":
    print c.state
    pass
Run Code Online (Sandbox Code Playgroud)

在app/tasks.py中

from celery import shared_task

@shared_task
def calculate(proj_id):

    #some calculations followed by a save of the object
Run Code Online (Sandbox Code Playgroud)

即使在芹菜日志中它表示任务已成功完成,状态也永远不会从挂起更改

[2014-06-10 17:55:11,417: INFO/MainProcess] Received task: app.tasks.calculate[1f11e7ab-0add-42df-beac-3d94c6868aac]
[2014-06-10 17:55:11,505: INFO/MainProcess] Task app.tasks.calculate[1f11e7ab-0add-42df-beac-3d94c6868aac] succeeded in 0.0864518239978s: None
Run Code Online (Sandbox Code Playgroud)

我还在mainapp/settings.py中放了CELERY_IGNORE_RESULT = False,但这似乎没有做任何事情.

noo*_*oob 9

直接来自doc:结果后端不起作用或任务总是处于PENDING状态.

所有任务都是PENDING默认的,因此状态更好地命名为"未知".发送任务时,Celery不会更新任何状态,并且任何没有历史记录的任务id都被认为是待处理的(毕竟你知道任务).

  1. 确保该任务未ignore_result启用.

    启用此选项将强制工作人员跳过更新状态.

  2. 确保CELERY_IGNORE_RESULT未启用该设置.

  3. 确保您没有任何旧工作人员仍在运行.

    偶然启动多个工作人员很容易,因此在开始新工作之前,请确保先前的工作人员已正确关闭.

    未配置预期结果后端的旧工作程序可能正在运行并且正在劫持任务.

    –pidfile参数可以设置为绝对路径,以确保不会发生这种情况.

  4. 确保客户端配置了正确的后端.

如果由于某种原因,客户端配置为使用不同的后端比工人,你将无法获得结果,因此要确保后端是通过检查是否正确:

>>> result = task.delay(…)
>>> print(result.backend)
Run Code Online (Sandbox Code Playgroud)


leh*_*ins 6

所以,你的设置是错误的.:)你还需要为芹菜设置经纪人才能工作.

首先,djcelery已弃用,所有内容都包含在其中以celery供其使用django.

其次,不要将所有内容设置为接受,这可能是潜在的安全风险.pickle仅在简单json不够的情况下使用(假设您将函数或对象作为参数传递给任务,或从任务返回)

所以我的猜测是,你只是尝试芹菜,这就是你尝试使用数据库后端的原因,这很好,但是对于生产用途,我建议使用RabbitMQ.

在任何情况下,尝试使用这些设置:

BROKER_URL = 'django://'
INSTALLED_APPS = (
    ...
    'kombu.transport.django', 
    ...
)
CELERY_RESULT_BACKEND = 'db+scheme://user:password@host:port/dbname' 
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_IGNORE_RESULT = False # this is less important
Run Code Online (Sandbox Code Playgroud)

然后运行 python manage.py syncdb

只是为了让你知道,我没有使用数据库作为经纪人或结果后端,因此设置可能不完整,甚至不正确,但无论如何都要试一试.

更多CELERY_RESULT_BACKEND数据库示例设置

如果您想将RabbitMQ设置为代理后端,我建议这样做,我肯定它会工作:

如果在ubuntu上运行:

sudo apt-get install rabbitmq-server
sudo rabbitmqctl add_user <username> <password>
sudo rabbitmqctl add_vhost <vhost, use project name for example>
sudo rabbitmqctl set_permissions -p <vhost> <username"> ".*" ".*" ".*"
Run Code Online (Sandbox Code Playgroud)

然后配置芹菜settings.py:

BROKER_URL = 'amqp://<user>:<password>@localhost:5672/<vhost>'
CELERY_TIMEZONE = TIME_ZONE
CELERY_RESULT_BACKEND = 'amqp'
# thats where celery will store scheduled tasks in case you restart the broker:
CELERYD_STATE_DB = "/full/path/data/celery_worker_state" 
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
Run Code Online (Sandbox Code Playgroud)

让我知道事情的后续.