You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

遵循Flask Celery文档启动Worker时触发TypeError: unhashable type: 'list'

解决Celery启动时的unhashable type: 'list'错误

我来帮你搞定这个Celery启动失败的问题!这个错误提示TypeError("unhashable type: 'list'",)其实指向了一个很常见的配置失误——你在Celery的配置里把列表(list)类型的值用在了需要哈希类型(比如字符串)的关键配置项上。

错误原因分析

Celery的核心配置(比如消息代理地址、结果后端地址)需要是可哈希的类型(通常是字符串),如果不小心把这些配置写成了列表格式(比如给broker_url赋值一个列表),Kombu(Celery依赖的消息库)在处理配置时就会抛出这个错误。

具体排查和修复步骤

  1. 检查Celery配置代码
    找到你初始化Celery实例的代码部分,重点核对以下几个关键配置项:

    • broker_url(或旧版本的BROKER_URL)
    • result_backend(或旧版本的CELERY_RESULT_BACKEND)
    • 其他涉及连接地址的配置
  2. 修正配置类型
    确保这些配置的值是字符串类型,而不是列表。举个正确的配置例子:

    # 正确写法
    from celery import Celery
    
    def make_celery(app):
        celery = Celery(app.import_name)
        celery.conf.broker_url = 'amqp://guest:guest@localhost:5672//'
        celery.conf.result_backend = 'redis://localhost:6379/0'
        # 其他配置...
        return celery
    

    避免这种错误写法:

    # 错误写法!会触发unhashable type错误
    celery.conf.broker_url = ['amqp://guest:guest@localhost:5672//']
    
  3. 排查配置文件(如果有)
    如果你是从外部配置文件(比如YAML、JSON)加载Celery配置,检查对应配置项是否被误解析成了列表。比如YAML中如果写了:

    broker_url:
      - amqp://guest:guest@localhost:5672//
    

    就会被解析成列表,改成单值字符串即可:

    broker_url: amqp://guest:guest@localhost:5672//
    

额外提示

如果你是参照Flask-Celery文档配置时出的问题,大概率是复制代码时不小心多敲了方括号,或者误把“多地址集群”的配置逻辑搞错了——Celery支持部分后端的集群地址,但通常是用特定格式的字符串(比如Redis集群用redis://host1:port1,host2:port2),而不是直接传列表。

内容的提问来源于stack exchange,提问作者user1601716

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:04:19