我对数据库有一些“重”请求,我将使用Celery执行。考虑到它们“很重”,我想按顺序执行它们(逐个执行)。一种可能的解决方案是在Celery的命令行中指定a[x]=b
。它有效。但是存在一个问题:在执行任务时,以下所有请求都会返回--concurrency=1
:
None
此外,运行from celery.task.control import inspect
# Inspect all nodes.
i = inspect()
print(i.scheduled()) # None
print(i.active()) # None
print(i.reserved()) # None
print(i.registered()) # None
会返回celery inspect ping
因此我无法收到有关Celery队列状态的任何信息。
有我的测试python模块:
celeryconfig.py
Error: No nodes replied within time constraint.
tasks.py
#BROKER_URL = 'redis://localhost:6379/0'
BROKER_URL = 'amqp://'
#CELERY_RESULT_BACKEND = "redis"
CELERY_RESULT_BACKEND = "amqp://"
# for php
CELERY_TASK_RESULT_EXPIRES = None
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_ACKS_LATE = True
client.py
from celery import Celery
from time import sleep
app = Celery('hello')
app.config_from_object('celeryconfig')
@app.task
def add(x, y):
sleep(30)
return x + y
那么,问题是,如何逐个运行任务并能够检查队列的状态?
答案 0 :(得分:1)
芹菜的检查是通过向任何听取并随后收集回复的内容广播查询来执行的。任何在超时内没有响应的工作者(我认为默认情况下是1秒)都会被忽略。就好像它不存在一样。
您使用--concurrency=1
这一事实应该不是问题。我刚尝试过,它在这里工作得很好。即使并发为1,Celery工作人员通常也会有额外的通信执行线程。 (我说"通常"因为我确定有办法配置芹菜在脚上射击。我说的是默认值。)当我尝试--concurrency=1
时实际上每个工作者两个线程。因此,即使工作人员忙于计算任务,也应该有一个能够响应广播的线程。
话虽这么说,如果机器负载很重,那么工人可能需要很长时间才能做出响应。我解决这个问题的方法是重试i.scheduled()
之类的电话,直到我得到所有人的回答。在我的项目中,我知道有多少工作人员应该启动并运行,所以我有一个列表,我可以用来了解每个人是否都有回应。