在芹菜中使用 celery.app.control 的正确方法

Right way to use celery.app.control in celery

我正在使用 celery 最新稳定版 4.4.7。最近想使用 celery.app.control 包 (https://docs.celeryproject.org/en/stable/reference/celery.app.control.html).

根据 API,我尝试了以下代码,但这没有用。我发现另一个包 celery.task.control 确实有效,但似乎将在 5.0 中删除。所以我想使用 celery.app.control。有人知道它们之间的区别以及如何以正确的方式使用 celery.app.control 吗?谢谢。

我已经阅读了 celery 文档指南并在 google 中进行了搜索,但没有找到答案。顺便说一句,我会抱怨芹菜文档不好,它包含很多不一致和错误。 :)

有效

>>> from celery.task.control import inspect
>>> i = inspect()
>>> i.registered()
{'celery@centos72_base': ['core.tasks.task1', 'core.tasks.task2']}

>>> i.active()
{'celery@centos72_base': []}

不工作

>>> from celery.app.control import Inspect 
>>> i = Inspect(app='test')
>>> i.active()
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/root/.virtualenvs/test/lib/python3.6/site-packages/celery/app/control.py", line 119, in active
    return self._request('active')
  File "/root/.virtualenvs/test/lib/python3.6/site-packages/celery/app/control.py", line 98, in _request
    return self._prepare(self.app.control.broadcast(
AttributeError: 'str' object has no attribute 'control'

这是我在各种监控脚本中所做的简化版本:

app = Celery("myapp", include=["myproject.tasks", "myproject.other.tasks"])
app.config_from_object(myproject.celeryconfig)

insp = app.control.inspect()
active_lst = insp.active()
for key in active_lst.keys():
    print(key)

我什至从未尝试过 inspect/monitoring API 不使用 Celery 实例...