芹菜预定清单返回无

时间:2014-06-16 03:02:53

标签: python rabbitmq celery

我对Celery很新,我一直在尝试设置一个简单的脚本来安排和取消安排任务。但是我觉得我遇到了一个奇怪的问题。我有以下设置

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

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

我启动我的芹菜服务器很好,可以添加任务。现在,当我想获得一系列活动任务时,事情似乎变得奇怪了。当我转到使用inspect获取计划任务列表时,它只运行一次,然后每次都返回None。

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

无论是否添加任务,都会发生这种情况。我想找到一种方法来始终从我的芹菜队列中返回任务列表。我想这样做,所以我可以找到一个以前排队的任务,撤销它,并重新安排它。我觉得我在这里缺少一些基本的东西。

2 个答案:

答案 0 :(得分:5)

要重复调用以获取队列中的任务列表,您必须创建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')

答案 1 :(得分:4)

感谢daniula,

我在django-celery-rabbitmq中使用此代码,我需要在检查后关闭app实例...就像这样:

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仍然活着(活动),这样所有套接字描述符将被消耗,之后,新的套接字连接不可用,所以一切都停止工作。