给定Redis Broker和数据库后端,Celery Task请求首先写入哪里?

时间:2019-07-17 01:00:49

标签: python redis celery

反正有没有要询问redis,芹菜或postgres,以在任务完成之前跟踪任务请求?

config:

BROKER_URL = "redis://localhost:6379"
CELERY_RESULT_BACKEND = "django-db"

from celery import Celery
from django.conf import settings

app = Celery(
   "someapp",
)

现在,过一会儿,表django_celery_results_taskresult包含ID及其名称,task_id,task_name和结果等任务。

  id  |             task_name             | status  |           date_done
------+-----------------------------------+---------+-------------------------------
 2162 | someapp.pssystem.tasks.initialize | SUCCESS | 2019-07-16 16:55:41.101537-07
 2163 | someapp.pssecurity.tasks.flush    | SUCCESS | 2019-07-16 17:11:45.599822-07
 2164 | someapp.pssecurity.tasks.flush    | SUCCESS | 2019-07-16 17:18:49.798436-07
 2165 | someapp.pssecurity.tasks.flush    | SUCCESS | 2019-07-16 17:26:45.349578-07
 2166 | someapp.pssecurity.tasks.flush    | SUCCESS | 2019-07-16 17:31:49.27337-07

但这只是在任务成功完成或出现错误之后的。我实质上是启动长时间运行的批处理,这些批处理可能很容易花费2-3分钟,我希望能够确认该任务已启动并在完成之前轮询其状态。

如果我要 redis-cli ,那里的情况也不是很清楚,这似乎与芹菜工作者的关系比其他任何事情都重要:

127.0.0.1:6379> select 0
OK
127.0.0.1:6379> keys *celery*
1) "_kombu.binding.celery.pidbox"
2) "_kombu.binding.celeryev"
3) "_kombu.binding.celery"
127.0.0.1:6379> smembers "_kombu.binding.celeryev"
1) "worker.#\x06\x16\x06\x16celeryev.026d2bed-ebc8-4c8b-a8c1-732cd847b381"
2) "worker.#\x06\x16\x06\x16celeryev.2f6efd77-f931-4c01-b45f-000f3ab9f5bd"
3) "worker.#\x06\x16\x06\x16celeryev.c0da9ba7-31fd-4a6b-be62-685423c7b542"
4) "worker.#\x06\x16\x06\x16celeryev.09ece5fd-3a45-4912-9c0f-ea1f9e67c930"
5) "worker.#\x06\x16\x06\x16celeryev.ad784e1f-47ad-402f-8359-295c35138fba"
6) "worker.#\x06\x16\x06\x16celeryev.633275dc-a090-4c2f-9d18-1d6b2d00f8e5"
7) "worker.#\x06\x16\x06\x16celeryev.2ee3da5b-1d65-4f8c-b652-8907af7b6eb1"
8) "worker.#\x06\x16\x06\x16celeryev.617f6218-9382-4965-8d3e-c1ed70cf96e4"
9) "worker.#\x06\x16\x06\x16celeryev.64c9beef-2d35-418c-a562-b0a6f0c4054e"
127.0.0.1:6379> smembers "_kombu.binding.celery"
1) "celery\x06\x16\x06\x16celery"

版本:

postgres                  9.6
celery                    4.3.0
Django                    2.2.3
django-celery-results     1.0.4

3 个答案:

答案 0 :(得分:0)

多种监视任务的方式。

  1. 您可以使用flower来监视任务。它是芹菜分布式任务队列的实时监视器和Web管理员。 https://github.com/mher/flower

  2. 或者您使用celery API来获取任务信息。

    result = app.AsyncResult(task_id)
    

答案 1 :(得分:0)

它在某种程度上取决于意图,但是您可以走几条不同的路线:

  1. Signals-在芹菜生命周期的不同阶段调用的钩子。示例-任务完成时记录
  2. Inspection-芹菜内置的api,用于查看不同任务的状态。这是花在引擎盖下使用的
  3. Redis API-使用python Redis实现检查给定队列。这类似于您在cli上所做的操作,但是我已经链接了一些示例

根据您的用例,我认为跟踪启动的信号组合以及用于轮询活动的redis api都可以工作。

答案 2 :(得分:0)

上面提到的两种方法,但最终起作用的是,在任务开始时立即在Table.django_celery_results_taskresult中获取行是更改Celery配置:

贷方转到:Celery tasks, states and results

app = Celery("foo")
app.conf.update(task_track_started=True)  # ? ✅