Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 跟踪芹菜组任务的进度?_Python_Django_Celery_Django Celery - Fatal编程技术网

Python 跟踪芹菜组任务的进度?

Python 跟踪芹菜组任务的进度?,python,django,celery,django-celery,Python,Django,Celery,Django Celery,问题:芹菜有什么东西可以检测团队任务的进展吗?我能得到有多少任务和有多少任务已经被处理的计数吗?在shell上修修补补(ipython的tab auto completion)我发现group_task(这是一个Cellery.result.ResultSet对象)有一个名为completed_count的方法,它正好满足了我的需要 还可以在阅读AsyncResult的文档中找到该文档。有一个collect方法可以在收到结果时收集结果 示例输出: from celery import grou

问题:芹菜有什么东西可以检测团队任务的进展吗?我能得到有多少任务和有多少任务已经被处理的计数吗?

在shell上修修补补(ipython的tab auto completion)我发现
group_task
(这是一个
Cellery.result.ResultSet
对象)有一个名为
completed_count
的方法,它正好满足了我的需要


还可以在

阅读
AsyncResult
的文档中找到该文档。有一个
collect
方法可以在收到结果时收集结果

示例输出:

from celery import group
from proj.celery import app

@app.task(trail=True)
def A(how_many):
    return group(B.s(i) for i in range(how_many))()

@app.task(trail=True)
def B(i):
    return pow2.delay(i)

@app.task(trail=True)
def pow2(i):
    return i ** 2
注: 必须启用
Task.trail
选项,以便子项列表存储在
result.children
中。这是默认设置,但为进行说明而显式启用

编辑:

进一步测试后,我们发现,虽然collect states将收集结果,但它仍在等待。我发现要取得进步,你需要得到孩子们的结果,就像这样:

>>> from celery.result import ResultBase
>>> from proj.tasks import A

>>> result = A.delay(10)
>>> [v for v in result.collect()
...  if not isinstance(v, (ResultBase, tuple))]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
tqdm在控制台中显示进度

mygrouptask是一个返回芹菜组的任务,如下所示:

group_result = mygrouptask.delay().get()
for result in tqdm(group_result.children, total=count):
    yield result.get()

下面是一个基于@dalore答案的完整工作示例

首先
tasks.py

return group(mytask.s(arg) for arg in args)()
使用Docker启动redis服务器:
Docker run——将my redis命名为-p 6379:6379-d redis

使用Docker:
Docker run-d——主机名my rabbit——命名my rabbit-p 5672:5672 RabbitMQ:alpine
启动RabbitMQ

在单独的shell中启动单个进程芹菜工作程序:
芹菜-任务工作程序--loglevel=info-c1

然后运行下面的测试脚本

import time
from celery import Celery, group

app = Celery('tasks', broker='pyamqp://guest@127.0.0.1//', backend='redis://localhost')

@app.task
def add(x, y, trail=True):
    time.sleep(1)
    return x + y

@app.task
def group_add(l1, l2, trail=True):
    return group(add.s(x1, x2) for x1, x2 in zip(l1, l2))()
您应该会看到下面这样的情况,进度条每秒增加10%

from tasks import group_add
from tqdm import tqdm

total = 10

l1 = range(total)
l2 = range(total)
delayed_results = group_add.delay(l1, l2)
delayed_results.get()  # Wait for parent task to be ready.

results = []
for result in tqdm(delayed_results.children[0], total=total):
    results.append(result.get())
print(results)

您好,您可能已经很久没有遇到这个问题了,但我想知道您如何使用它来跟踪组任务的进度而不阻塞。。?据我所知,我需要分配
result=task\u group.apply\u async()
,但仅仅是分配本身就会阻塞。另一方面,如果我们不赋值,我们就没有
completed\u count
等的ResultSet方法。@zerohedge
result=task\u group.apply\u async()
不应该阻塞以等待结果,它将阻塞直到所有任务排队,如果您有大量任务,这将需要一段时间。这将等待所有子任务完成,然后返回结果。当组仍在运行时,它不会显示进度更新以实际生成进度,在生产中工作
from tasks import group_add
from tqdm import tqdm

total = 10

l1 = range(total)
l2 = range(total)
delayed_results = group_add.delay(l1, l2)
delayed_results.get()  # Wait for parent task to be ready.

results = []
for result in tqdm(delayed_results.children[0], total=total):
    results.append(result.get())
print(results)
50%|#####     | 5/10 [00:05<00:05,  1.01s/it
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
docker stop my-rabbit my-redis
docker rm my-rabbit my-redis