【问题标题】:How can I change the name of a task that Celery sends to a backend?如何更改 Celery 发送到后端的任务的名称?
【发布时间】:2019-05-09 17:16:42
【问题描述】:

我使用 Celery 构建了一个队列系统,它接受 Web 请求并执行一些任务来处理这些请求。我使用 Redis 作为 Celery 的后端,但我想这个问题将适用于所有后端。

Celery 将任务名称返回为celery-task-meta-<task ID> 并将其存储在后端。这对我来说毫无意义。如何更改 celery 发送到 Redis 的结果的名称?我搜索了所有Celery's documentation,试图弄清楚如何做到这一点。

Redis CLI 监视器显示 Celery 正在使用 SETEX 方法并发送以下输入:

“SETEX”“celery-task-meta-dd32ded3-00aa-4884-8b21-42f8332e7fac” "86400" "{\"status\": \"SUCCESS\", \"result\": {\"mode\": \"staging\", \"123\": 50}, \"traceback\": null, \"children\": [], \"task_id\": \"dd32ded3-00aa-4884-8b21-42f8332e7fac\", \"date_done\": \"2019-05-09T16:44:12.826951\", \"parent_id\": \"2e99d958-cd5a-4700-a7c2-22c90f387f28\"}"

您可以在上面的 SETEX 命令中看到的"result": {...} 是任务返回的内容。我希望 SETEX 更符合以下几点: "SETEX" "mode-staging-123-50-SUCCESS" "{...}",这样当我在 Redis 中查看我的所有键时,键的名称对我来说是信息性的。

这是我的 Redis 缓存中无意义的键的另一个示例视图:

【问题讨论】:

    标签: python-3.x redis celery


    【解决方案1】:

    你无法改变这一点。任务密钥由 Redis 后端使用的 ResultConsumer 类创建。 ResultConsumer 然后将任务密钥的创建委托给 BaseKeyValueStoreBackend 类。实际创建密钥的get_key_for_task 方法使用硬编码的task_keyprefix 设置为celery-task-meta-。因此,要改变行为,您必须对这些类进行子类化。它没有配置选项。

    【讨论】:

    • 感谢您的回复。为了准确起见,您是说无法更改吗?不能简单地修补 Celery 以在 BaseKeyValueStoreBackend 类中动态创建一个新任务名称吗?这显然比它的价值要多得多,所以我想我会选择其他的。
    • 这就是我想说的。这并非完全不可能,只是需要大量工作。此外,您必须维护您的修改。
    猜你喜欢
    • 2012-03-21
    • 2018-11-12
    • 2011-05-18
    • 1970-01-01
    • 2017-03-12
    • 2013-03-12
    • 2023-04-11
    • 2023-02-25
    • 2013-10-14
    相关资源
    最近更新 更多