尽管 task_track_started=True,但 Celery 长时间运行的任务状态仍会恢复到挂起状态

时间:2021-05-05 16:04:05

标签: python celery

有很多类似的问题,但我无法弄清楚在我的情况下发生了什么。

我正在使用 celery 对必须按顺序执行的长时间运行的任务进行排队。

我以这种方式启动任务:

task = mytask.apply_async(
   args=[myargs],
   task_id=my_custom_task_id,
   queue="gpu_queue",
)

我以这种方式启动工作线程:

celery -A celery_app worker -Q gpu_queue --loglevel=INFO --concurrency=1 -E

mytask 内部,我经常打电话给 current_task.update_state(state="MYCUSTOMSTATE", meta={'customkey': 'customvalue'})

我尝试通过以下方式监控任务状态:

task = celery_app.AsyncResult(task_id)
task.status
task.result  # contains the the meta dict

一切正常,除了队列中有多个任务时,正在运行的任务会随机 (?) 报告 PENDING 作为其状态和一个空的元字典,即使我使用task_track_started=Trueceleryconfig.py。这非常令人沮丧,因为除了虚假报告之外,我对这一切的运作方式感到非常满意。有没有办法解决这个问题? celery 是错误的工作工具吗?

我能想到的唯一解决方法是让我的监控应用程序在收到任务已经开始的信息时不切换显示 PENDING 状态,但这感觉很hacky。

MWE

app.py
import time

from celery import Celery, current_task

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

@app.task
def add(x, y):
    current_task.update_state(state="Running")
    for i in range(5):
        time.sleep(1)
    return x + y

watch.py​​
import time

from app import app, add

task = add.apply_async(
    args=[1, 2],
    task_id="task1",
)

print("task1 alone")

for _ in range(5):
    print("task1", app.AsyncResult("task1").status)
    time.sleep(0.5)

task = add.apply_async(
    args=[3, 4],
    task_id="task2",
)

print("task2 was launched")

while not app.AsyncResult("task2").ready():
    print("task1", app.AsyncResult("task1").status)
    print("task2", app.AsyncResult("task2").status)
    time.sleep(0.5)

celeryconfig.py
task_track_started=True

docker run -p 5672:5672 rabbitmq

celery --config=celeryconfig -A app worker --loglevel=INFO --concurrency=1 -E

python watch.py

输出:

task1 alone
task1 PENDING
task1 Running
task1 Running
task1 Running
task1 Running
task2 was launched
task1 Running
task2 PENDING
task1 PENDING
task2 PENDING
task1 PENDING
task2 PENDING
task1 PENDING
task2 PENDING
task1 PENDING
task2 PENDING
task1 SUCCESS
task2 Running
task1 PENDING
task2 Running
task1 PENDING
task2 PENDING
task1 PENDING
task2 PENDING
task1 PENDING
task2 PENDING
task1 PENDING
task2 PENDING
task1 PENDING
task2 PENDING
task1 PENDING
task2 PENDING
task1 PENDING
task2 PENDING
task1 PENDING
task2 PENDING

1 个答案:

答案 0 :(得分:0)

通过使用 redis 作为 celery 后端并将 printView() { var tblData = document.getElementById("tblData"); var win = window.open("", "", "height=700,width=700"); win.document.write(tblData.outerHTML); win.document.close(); win.print(); } 添加到 conf 解决了我的问题。我不确定我遇到的是 celery 错误还是 RPC 后端的预期行为。

相关问题