Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.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 芹菜长时间运行的任务状态返回到挂起状态,尽管任务\u track\u started=True_Python_Celery - Fatal编程技术网

Python 芹菜长时间运行的任务状态返回到挂起状态,尽管任务\u track\u started=True

Python 芹菜长时间运行的任务状态返回到挂起状态,尽管任务\u track\u started=True,python,celery,Python,Celery,有很多类似的问题,但我不知道在我的案例中发生了什么 我正在使用芹菜将长时间运行的任务排队,这些任务必须按顺序执行 我以这种方式启动任务: task=mytask.apply\u async( args=[myargs], 任务\u id=我的\u自定义\u任务\u id, queue=“gpu\U队列”, ) 我以这种方式启动worker: 芹菜-芹菜应用程序工作者-QGPU队列--loglevel=INFO--concurrency=1-E 在mytask内部,我定期调用当前任务。更新任务状

有很多类似的问题,但我不知道在我的案例中发生了什么

我正在使用芹菜将长时间运行的任务排队,这些任务必须按顺序执行

我以这种方式启动任务:

task=mytask.apply\u async(
args=[myargs],
任务\u id=我的\u自定义\u任务\u id,
queue=“gpu\U队列”,
)
我以这种方式启动worker:

芹菜-芹菜应用程序工作者-QGPU队列--loglevel=INFO--concurrency=1-E

mytask
内部,我定期调用
当前任务。更新任务状态(state=“MYCUSTOMSTATE”,meta={'customkey':'customvalue'})

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

task = celery_app.AsyncResult(task_id)
task.status
task.result  # contains the the meta dict
除了队列中有多个任务时,正在运行的任务会随机(?)报告其状态为
PENDING
,并报告一个空的元数据,,即使我在
celeryconfig.py
中使用了
task\u track\u start=True
。这是非常令人沮丧的,因为除了虚假的报道,我很高兴这一切是如何运作的。有解决办法吗?芹菜是做这项工作的错误工具吗

我能想到的唯一修复方法是让我的监控应用程序在收到任务已经启动的信息时不切换显示挂起状态,但这感觉很不舒服

MWE app.py 小心点 celeryconfig.py
docker运行-p 5672:5672 rabbitmq

芹菜--config=celeryconfig-A应用程序工作者--loglevel=INFO--concurrency=1-E

python watch.py

输出:
通过使用redis作为芹菜后端并将
result\u persistent=True
添加到配置文件中,解决了我的问题。我不确定我遇到的是芹菜bug还是RPC后端的预期行为。

你是说它报告启动状态,然后报告挂起?如果是这样的话,我会说这是一个应该报告的bug,或者他们应该更新文档,说明芹菜在启动后可能会报告挂起状态。。。在您的情况下,我希望报告MYCUSTOMSTATE而不是挂起。我甚至看不到启动状态,因为我每1s轮询一次以显示状态,所以我只看到MYCUSTOMSTATE,然后在启动第二个任务时再次挂起。偶尔,我会再次看到我的CustomState。但任务肯定在处理中,如果我只是等待它完成,然后第二个任务开始。所以你说这不应该发生。我必须在MWE上工作,以便在bug报告中重现这一点。谢谢你的回答。
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
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