有很多类似的问题,但我无法弄清楚在我的情况下发生了什么。
我正在使用 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=True
在 celeryconfig.py
。这非常令人沮丧,因为除了虚假报告之外,我对这一切的运作方式感到非常满意。有没有办法解决这个问题? celery 是错误的工作工具吗?
我能想到的唯一解决方法是让我的监控应用程序在收到任务已经开始的信息时不切换显示 PENDING 状态,但这感觉很hacky。
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
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)
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
答案 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 后端的预期行为。