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,但这似乎没有做任何事情.
直接来自doc:结果后端不起作用或任务总是处于PENDING状态.
所有任务都是PENDING默认的,因此状态更好地命名为"未知".发送任务时,Celery不会更新任何状态,并且任何没有历史记录的任务id都被认为是待处理的(毕竟你知道任务).
确保该任务未ignore_result启用.
启用此选项将强制工作人员跳过更新状态.
确保CELERY_IGNORE_RESULT未启用该设置.
确保您没有任何旧工作人员仍在运行.
偶然启动多个工作人员很容易,因此在开始新工作之前,请确保先前的工作人员已正确关闭.
未配置预期结果后端的旧工作程序可能正在运行并且正在劫持任务.
该–pidfile参数可以设置为绝对路径,以确保不会发生这种情况.
确保客户端配置了正确的后端.
如果由于某种原因,客户端配置为使用不同的后端比工人,你将无法获得结果,因此要确保后端是通过检查是否正确:
>>> result = task.delay(…)
>>> print(result.backend)
Run Code Online (Sandbox Code Playgroud)
所以,你的设置是错误的.:)你还需要为芹菜设置经纪人才能工作.
首先,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)
让我知道事情的后续.
| 归档时间: |
|
| 查看次数: |
15556 次 |
| 最近记录: |