Celery 定时任务列表返回 None

7 投票
2 回答
3629 浏览
提问于 2025-04-18 09:53

我刚接触Celery,正在尝试设置一个简单的脚本来安排和取消任务。不过我遇到了一些奇怪的问题。我的设置如下:

from celery import Celery
app = Celery('celery_test',
             broker='amqp://',
             backend='amqp')

@app.task
def add(x, y):
    return x + y

我可以顺利启动我的celery服务器,并且可以添加任务。可是当我想查看当前活跃的任务列表时,情况就变得奇怪了。当我使用inspect命令来获取已安排的任务列表时,它只在第一次有效,之后每次都返回None。

>>> i = app.control.inspect()
>>> print i.scheduled()
{u'celery@mymachine': []}
>>> print i.scheduled()
None
>>>

无论我是否添加任务,这种情况都会发生。我想找到一种方法,能够稳定地从我的celery队列中返回任务列表。我这么做是为了能够找到之前排队的任务,撤销它,然后重新安排。我觉得我可能漏掉了一些基本的东西。

2 个回答

6

感谢daniula,

我在使用django-celery-rabbitmq这段代码时,需要在检查完后关闭应用实例,像这样:

from celery import Celery

def inspect(method):
    app = Celery('app', broker='amqp://')
    inspect_result = getattr(app.control.inspect(), method)()
    app.close()
    return inspect_result

print inspect('scheduled')
print inspect('active')

在我的情况下,如果我不调用app.close(),与rabbitmq的连接就会一直保持活跃。这样的话,所有的连接资源都会被占用,之后就无法再建立新的连接了,这样一来,整个程序就会停止工作。

6

要重复调用获取队列中任务列表,你需要创建一个新的Celery对象实例。我试着通过调试执行./manage.py celery inspect scheduled这段代码来弄明白为什么这样做是必要的,但没有找到答案。也许有人有更多经验,可以在这个回答中补充一些信息。

可以试试这个简单的代码片段来检查已安排的任务列表:

from celery import Celery

def inspect(method):
    app = Celery('app', broker='amqp://')
    return getattr(app.control.inspect(), method)()

print inspect('scheduled')
print inspect('active')

撰写回答