@celery.task
def my_task(my_object):
do_something_to_my_object(my_object)
#in the code somewhere
tasks = celery.group([my_task.s(obj) for obj in MyModel.objects.all()])
group_task = tasks.apply_async()
问:芹菜有什么东西可以检测小组任务的进度吗?我能数一数那里有多少任务,有多少已被处理?
Tags:
下面是一个基于@dalore答案的完整工作示例。
第一个
tasks.py
。使用Docker启动redis服务器:
docker run --name my-redis -p 6379:6379 -d redis
。使用Docker启动RabbitMQ:
docker run -d --hostname my-rabbit --name my-rabbit -p 5672:5672 rabbitmq:alpine
。在一个单独的shell中启动一个单进程芹菜工人:
celery -A tasks worker --loglevel=info -c 1
。然后运行下面的测试脚本。
你应该会看到如下的进度条以每秒10%的速度增长。
最后,清理redis和rabbitmq容器。
在shell上进行修补(ipython的tab auto completion)我发现
group_task
(它是一个celery.result.ResultSet
对象)有一个名为completed_count
的方法,它正好给出了我需要的东西。也可以在http://docs.celeryproject.org/en/latest/reference/celery.result.html#celery.result.ResultSet.completed_count找到文档
阅读
AsyncResult
的文档时,有一个collect
方法可以在结果传入时收集结果。http://docs.celeryproject.org/en/latest/reference/celery.result.html#celery.result.AsyncResult.collect
示例输出:
注: 必须启用
Task.trail
选项,以便子项列表存储在result.children
中。这是默认设置,但已显式启用以供说明。编辑:
在进一步的测试中发现,虽然收集状态将收集结果,但它仍在等待。我发现要想取得进展,你需要得到孩子们的结果,就像这样:
tqdm在控制台中显示进度
mygrouptask是一个返回芹菜组,如下所示:
相关问题 更多 >
编程相关推荐