Celery 定时任务列表返回 None
我刚接触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')