news 2026/9/20 13:18:04

Celery 配置升级实战:用 `celery upgrade settings` 将 3.x 旧式设置迁移到 4.x 新命名规范

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Celery 配置升级实战:用 `celery upgrade settings` 将 3.x 旧式设置迁移到 4.x 新命名规范
  • 任务调度
  • 后端
  • 消息队列

【免费下载链接】celery

Distributed Task Queue (development branch)

项目地址:https://gitcode.com/gh_mirrors/ce/celery
点击查看免费下载

本篇技术指南以 Celery 仓库中的celery upgrade命令(celery/bin/upgrade.py)为核心,讲解如何将 Celery 3.x 时代的旧式大写配置(如BROKER_URLCELERY_ALWAYS_EAGER)一键迁移为 4.x 及以后版本的全小写新命名(如broker_urltask_always_eager),并覆盖 Django 项目的CELERY_命名空间改造。读完本文,你将掌握celery upgrade settings的完整用法、三个选项(--django/--compat/--no-backup)的适用场景、备份与回滚机制,以及新旧设置名背后的映射表与源码实现原理,从而安全、无痛地完成项目配置升级。

为什么需要升级设置名:4.0 起命名规范全面变更

Celery 4.0 对配置系统做了一次"为美而战"(in pursuit of beauty)的大规模改名:所有设置名改为全小写,并对前缀进行了系统性梳理。这一变更完全向后兼容——旧的大写名称仍然可用,但官方强烈建议尽快迁移。仓库文档 docs/history/whatsnew-4.0.rst 明确指出,迁移工作可以交给celery upgrade settings命令自动完成。

核心变更可归纳为三条规则:

  1. 大小写规范化:所有设置名由全大写改为全小写,例如BROKER_URLbroker_url
  2. 前缀重构
    • celerybeat_前缀更名为beat_(如CELERYBEAT_SCHEDULEbeat_schedule);
    • celeryd_前缀更名为worker_(如CELERYD_CONCURRENCYworker_concurrency);
    • 去掉celery_前缀,任务相关设置改挂task_前缀,worker 相关设置改挂worker_前缀(如CELERY_ALWAYS_EAGERtask_always_eagerCELERY_TASK_SERIALIZERtask_serializer)。
  3. 个别特殊改名:少量设置不仅改前缀还改了语义名称,例如CELERY_MAX_CACHED_RESULTSresult_cache_maxCELERY_RESULT_DBURI→ 直接改用result_backend(详见下文"特殊重命名"表)。

命令基本用法:一条命令完成就地迁移

celery upgrade是 Celery CLI 中用于"在版本之间执行升级"的命令组,目前包含settings一个子命令,其职责在源码 docstring 中写明为"Migrate settings from Celery 3.x to Celery 4.x"(celery/bin/upgrade.py)。

基本调用方式(针对普通 Python 项目的配置模块,例如proj/celeryconfig.py):

$ celery upgrade settings proj/settings.py

执行过程分三步(对应 celery/bin/upgrade.py 的实现):

  1. 读取文件_slurp以 UTF-8 编码逐行读入目标文件全部内容;
  2. 逐行替换:对每一行调用_to_new_key做新旧键名映射替换,得到(did_change, line_contents)元组列表;
  3. 写回与备份:只要有任何一行发生了变更,默认先在原文件旁生成备份文件(如proj/settings.py.orig),再把替换后的内容写回原文件。

命令结束时会在标准输出打印结果:有变更时输出Changes to your setting have been made!;无需变更时输出Does not seem to require any changes :-)

备份机制:.orig文件与回滚

celery upgrade settings默认会进行"原地修改 + 备份"。备份逻辑位于_backup(celery/bin/upgrade.py):它把原文件完整复制为追加.orig后缀的新文件(例如proj/settings.pyproj/settings.py.orig),并打印writing backup to proj/settings.py.orig...settings命令文档(docs/history/whatsnew-4.0.rst)也明确承诺:命令会就地修改你的模块为新的小写名称,并保存一份.orig备份。这意味着升级后可随时用备份文件对比检查或回滚。

三个选项详解:--django--compat--no-backup

在 celery/bin/upgrade.py 中,settings子命令声明了三个互不冲突的选项:

选项类型作用
--djangoflag以 Django 项目模式升级:所有设置补上CELERY_前缀(同时转为新命名)
--compatflag保持向后兼容:同样为设置名补上CELERY_前缀,但不限定 Django 场景
--no-backupflag不生成.orig备份文件,直接覆盖原文件

这三个选项的生效逻辑非常简洁(celery/bin/upgrade.py):

keyfilter = _compat_key if django or compat else pass1
  • 默认(两者均不指定)时,keyfilter为恒等函数pass1,仅做大小写/前缀规范化,即BROKER_URLbroker_url
  • 指定--django--compat时,keyfilter切换为_compat_key(celery/bin/upgrade.py),它会在原有基础上再给每个设置名补上CELERY_前缀(若本身不以CELERY开头),得到CELERY_BROKER_URL这种 Django 风格的大写命名。

因此三条命令产生三种结果风格:

# 普通模式:全小写新命名 $ celery upgrade settings proj/settings.py # BROKER_URL -> broker_url # Django/兼容模式:大写 + CELERY_ 前缀 $ celery upgrade settings proj/settings.py --django # BROKER_URL -> CELERY_BROKER_URL # 不备份直接覆盖 $ celery upgrade settings proj/settings.py --no-backup

Django 项目迁移:--djangoCELERY_命名空间

对于从 Djangosettings.py加载 Celery 配置的项目,官方推荐使用CELERY_前缀,把 Celery 配置与 Django 自身及其他应用的配置隔离。仓库的 Django 示例项目即采用这一模式(见 examples/django/proj/celery.py 与 examples/django/proj/settings.py):

# proj/celery.py app.config_from_object('django.conf:settings', namespace='CELERY')
# proj/settings.py —— 升级后的目标形态 CELERY_BROKER_URL = 'redis://localhost:6379/0' CELERY_TASK_ALWAYS_EAGER = True CELERY_WORKER_CONCURRENCY = 4

迁移旧 Django 项目分两步(docs/userguide/configuration.rst 与 docs/history/whatsnew-4.0.rst):

第一步:升级设置文件。对旧的 Django 配置执行:

$ celery upgrade settings proj/settings.py --django

--django会为原本没有前缀的设置补上CELERY_。例如旧的BROKER_URL应写成CELERY_BROKER_URL——这一转换完全由命令自动完成,无需手工改动。

第二步:在celery.py中显式声明命名空间。proj/celery.py里通过app.config_from_object('django.conf:settings', namespace='CELERY')让应用从带前缀的 Django 设置中读取配置。完整的 Django 集成示例可参考 docs/django/first-steps-with-django.rst。

新旧设置名对照表

常见设置对照(旧 → 新)

下表完整摘录自 docs/userguide/configuration.rst 的官方对照表,覆盖 broker、result backend、任务与 worker 等核心配置域:

旧设置名(3.x)新设置名(4.x+)
CELERY_ACCEPT_CONTENTaccept_content
CELERY_ENABLE_UTCenable_utc
CELERY_IMPORTSimports
CELERY_INCLUDEinclude
CELERY_TIMEZONEtimezone
CELERYBEAT_MAX_LOOP_INTERVALbeat_max_loop_interval
CELERYBEAT_SCHEDULEbeat_schedule
CELERYBEAT_SCHEDULERbeat_scheduler
CELERYBEAT_SCHEDULE_FILENAMEbeat_schedule_filename
CELERYBEAT_SYNC_EVERYbeat_sync_every
BROKER_URLbroker_url
BROKER_TRANSPORTbroker_transport
BROKER_TRANSPORT_OPTIONSbroker_transport_options
BROKER_CONNECTION_TIMEOUTbroker_connection_timeout
BROKER_CONNECTION_RETRYbroker_connection_retry
BROKER_CONNECTION_MAX_RETRIESbroker_connection_max_retries
BROKER_FAILOVER_STRATEGYbroker_failover_strategy
BROKER_HEARTBEATbroker_heartbeat
BROKER_LOGIN_METHODbroker_login_method
BROKER_NATIVE_DELAYED_DELIVERY_QUEUE_TYPEbroker_native_delayed_delivery_queue_type
BROKER_POOL_ACQUIRE_TIMEOUTbroker_pool_acquire_timeout
BROKER_POOL_LIMITbroker_pool_limit
BROKER_USE_SSLbroker_use_ssl
CELERY_CACHE_BACKENDcache_backend
CELERY_CACHE_BACKEND_OPTIONScache_backend_options
CASSANDRA_COLUMN_FAMILYcassandra_table
CASSANDRA_ENTRY_TTLcassandra_entry_ttl
CASSANDRA_KEYSPACEcassandra_keyspace
CASSANDRA_PORTcassandra_port
CASSANDRA_READ_CONSISTENCYcassandra_read_consistency
CASSANDRA_SERVERScassandra_servers
CASSANDRA_WRITE_CONSISTENCYcassandra_write_consistency
CASSANDRA_OPTIONScassandra_options
S3_ACCESS_KEY_IDs3_access_key_id
S3_SECRET_ACCESS_KEYs3_secret_access_key
S3_BUCKETs3_bucket
S3_BASE_PATHs3_base_path
S3_ENDPOINT_URLs3_endpoint_url
S3_REGIONs3_region
CELERY_COUCHBASE_BACKEND_SETTINGScouchbase_backend_settings
CELERY_ARANGODB_BACKEND_SETTINGSarangodb_backend_settings
CELERY_MONGODB_BACKEND_SETTINGSmongodb_backend_settings
CELERY_EVENT_QUEUE_EXPIRESevent_queue_expires
CELERY_EVENT_QUEUE_TTLevent_queue_ttl
CELERY_EVENT_QUEUE_DURABLEevent_queue_durable
CELERY_EVENT_QUEUE_EXCLUSIVEevent_queue_exclusive
CELERY_EVENT_QUEUE_PREFIXevent_queue_prefix
CELERY_EVENT_SERIALIZERevent_serializer
CELERY_REDIS_DBredis_db
CELERY_REDIS_HOSTredis_host
CELERY_REDIS_MAX_CONNECTIONSredis_max_connections
CELERY_REDIS_USERNAMEredis_username
CELERY_REDIS_PASSWORDredis_password
CELERY_REDIS_PORTredis_port
CELERY_REDIS_BACKEND_USE_SSLredis_backend_use_ssl
CELERY_REDIS_BACKEND_CREDENTIAL_PROVIDERredis_backend_credential_provider
CELERY_RESULT_BACKENDresult_backend
CELERY_MAX_CACHED_RESULTSresult_cache_max
CELERY_RESULT_COMPRESSIONresult_compression
CELERY_RESULT_EXCHANGEresult_exchange
CELERY_RESULT_EXCHANGE_TYPEresult_exchange_type
CELERY_RESULT_EXPIRESresult_expires
CELERY_RESULT_PERSISTENTresult_persistent
CELERY_RESULT_SERIALIZERresult_serializer
CELERY_RESULT_DBURI改用result_backend
CELERY_RESULT_ENGINE_OPTIONSdatabase_engine_options
[...]_DB_SHORT_LIVED_SESSIONSdatabase_short_lived_sessions
CELERY_RESULT_DB_TABLE_NAMESdatabase_db_names
CELERY_SECURITY_CERTIFICATEsecurity_certificate
CELERY_SECURITY_CERT_STOREsecurity_cert_store
CELERY_SECURITY_KEYsecurity_key
CELERY_SECURITY_KEY_PASSWORDsecurity_key_password
CELERY_ACKS_LATEtask_acks_late
CELERY_ACKS_ON_FAILURE_OR_TIMEOUTtask_acks_on_failure_or_timeout
CELERY_TASK_ALWAYS_EAGERtask_always_eager
CELERY_ANNOTATIONStask_annotations
CELERY_MESSAGE_COMPRESSIONtask_compression
CELERY_CREATE_MISSING_QUEUEStask_create_missing_queues
CELERY_CREATE_MISSING_QUEUE_TYPEtask_create_missing_queue_type
CELERY_CREATE_MISSING_QUEUE_EXCHANGE_TYPEtask_create_missing_queue_exchange_type
CELERY_DEFAULT_DELIVERY_MODEtask_default_delivery_mode
CELERY_DEFAULT_EXCHANGEtask_default_exchange
CELERY_DEFAULT_EXCHANGE_TYPEtask_default_exchange_type
CELERY_DEFAULT_QUEUEtask_default_queue
CELERY_DEFAULT_QUEUE_TYPEtask_default_queue_type
CELERY_DEFAULT_RATE_LIMITtask_default_rate_limit
CELERY_DEFAULT_ROUTING_KEYtask_default_routing_key
CELERY_EAGER_PROPAGATEStask_eager_propagates
CELERY_IGNORE_RESULTtask_ignore_result
CELERY_PUBLISH_RETRYtask_publish_retry
CELERY_PUBLISH_RETRY_POLICYtask_publish_retry_policy
CELERY_QUEUEStask_queues
CELERY_ROUTEStask_routes
CELERY_SEND_SENT_EVENTtask_send_sent_event
CELERY_TASK_SERIALIZERtask_serializer
CELERYD_SOFT_TIME_LIMITtask_soft_time_limit
CELERY_TASK_TRACK_STARTEDtask_track_started
CELERY_TASK_REJECT_ON_WORKER_LOSTtask_reject_on_worker_lost
CELERYD_TIME_LIMITtask_time_limit
CELERY_ALLOW_ERROR_CB_ON_CHORD_HEADERtask_allow_error_cb_on_chord_header
CELERYD_AGENTworker_agent
CELERYD_AUTOSCALERworker_autoscaler
CELERYD_CONCURRENCYworker_concurrency
CELERYD_CONSUMERworker_consumer
CELERY_WORKER_DIRECTworker_direct
CELERY_DISABLE_RATE_LIMITSworker_disable_rate_limits
CELERY_ENABLE_REMOTE_CONTROLworker_enable_remote_control
CELERYD_HIJACK_ROOT_LOGGERworker_hijack_root_logger
CELERYD_LOG_COLORworker_log_color
CELERY_WORKER_LOG_FORMATworker_log_format
CELERYD_WORKER_LOST_WAITworker_lost_wait
CELERYD_MAX_TASKS_PER_CHILDworker_max_tasks_per_child
CELERYD_POOLworker_pool
CELERYD_POOL_PUTLOCKSworker_pool_putlocks
CELERYD_POOL_RESTARTSworker_pool_restarts
CELERYD_PREFETCH_MULTIPLIERworker_prefetch_multiplier
CELERYD_ETA_TASK_LIMITworker_eta_task_limit
CELERYD_ENABLE_PREFETCH_COUNT_REDUCTIONworker_enable_prefetch_count_reduction
CELERYD_REDIRECT_STDOUTSworker_redirect_stdouts
CELERYD_REDIRECT_STDOUTS_LEVELworker_redirect_stdouts_level
CELERY_SEND_EVENTSworker_send_task_events
CELERYD_STATE_DBworker_state_db
CELERY_WORKER_TASK_LOG_FORMATworker_task_log_format
CELERYD_TIMERworker_timer
CELERYD_TIMER_PRECISIONworker_timer_precision
CELERYD_DETECT_QUORUM_QUEUESworker_detect_quorum_queues

特殊重命名(语义变化)

除前缀统一外,个别设置在改名时还调整了语义或归属,摘录自 docs/history/whatsnew-4.0.rst:

旧设置名(3.x)新设置名(4.x+)
CELERY_MAX_CACHED_RESULTSresult_cache_max
CELERY_MESSAGE_COMPRESSIONresult_compression/task_compression
CELERY_TASK_RESULT_EXPIRESresult_expires
CELERY_RESULT_DBURIresult_backend
CELERY_RESULT_ENGINE_OPTIONSdatabase_engine_options
-*-_DB_SHORT_LIVED_SESSIONSdatabase_short_lived_sessions
CELERY_RESULT_DB_TABLE_NAMESdatabase_db_names
CELERY_ACKS_LATEtask_acks_late
CELERY_ALWAYS_EAGERtask_always_eager
CELERY_ANNOTATIONStask_annotations
CELERY_CREATE_MISSING_QUEUEStask_create_missing_queues
CELERY_DEFAULT_DELIVERY_MODEtask_default_delivery_mode
CELERY_DEFAULT_EXCHANGEtask_default_exchange
CELERY_DEFAULT_EXCHANGE_TYPEtask_default_exchange_type
CELERY_DEFAULT_QUEUEtask_default_queue
CELERY_DEFAULT_RATE_LIMITtask_default_rate_limit
CELERY_DEFAULT_ROUTING_KEYtask_default_routing_key
-"-_EAGER_PROPAGATES_EXCEPTIONStask_eager_propagates
CELERY_IGNORE_RESULTtask_ignore_result
CELERY_TASK_PUBLISH_RETRYtask_publish_retry
CELERY_TASK_PUBLISH_RETRY_POLICYtask_publish_retry_policy
CELERY_QUEUEStask_queues
CELERY_ROUTEStask_routes
CELERY_SEND_TASK_SENT_EVENTtask_send_sent_event
CELERY_TASK_SERIALIZERtask_serializer
CELERYD_TASK_SOFT_TIME_LIMITtask_soft_time_limit

源码原理:_TO_NEW_KEY映射表如何驱动替换

celery upgrade settings之所以能自动完成新旧键名替换,底层依赖一张由celery/app/defaults.py在模块加载时生成的映射表_TO_NEW_KEY

映射表的生成链路如下(celery/app/defaults.py):

  1. NAMESPACES以嵌套字典定义全部配置项,每个配置项是Option对象;带旧名的选项通过old={...}参数声明其历史名称,例如send_task_events声明了old={'celery_send_events'}(celery/app/defaults.py);
  2. _to_compat遍历所有配置项:若选项声明了opt.old,则把旧键映射到新键;否则把同名键大写后映射到自身,从而保证新旧名称一一对应;
  3. flatten(NAMESPACES, keyfilter=_to_compat)生成(old_key, new_key, opt)三元组列表,最终产出三个字典:
    • _TO_NEW_KEY:旧键 → 新键(upgrade settings命令正是消费这张表);
    • _TO_OLD_KEY:新键 → 旧键(用于反向兼容);
    • _OLD_DEFAULTS:旧键 → 默认值。

替换逻辑位于_to_new_key(celery/bin/upgrade.py),它有一个值得注意的细节——按旧键名长度降序匹配

for old_key in reversed(sorted(source, key=lambda x: len(x))): new_line = line.replace(old_key, keyfilter(source[old_key])) if line != new_line and 'CELERY_CELERY' not in new_line: return 1, new_line # only one match per line. return 0, line

源码注释解释了原因:避免broker_transport抢先匹配并覆盖broker_transport_options这类前缀包含关系。长键先替换可保证子键不被父键误伤;同时每行只做一次替换即返回,并且用'CELERY_CELERY' not in new_line防止重复加前缀产生CELERY_CELERY_...这类错误键名。

单元测试 t/unit/app/test_defaults.py 对映射表的自洽性做了严格校验:

  • DEFAULTS中不含任何大写键,_OLD_DEFAULTS中不含任何小写键(新旧两套命名互不混杂);
  • _TO_NEW_KEY的每个键都属于_OLD_SETTING_KEYS_TO_OLD_KEY的每个键都属于SETTING_KEYS,且映射后的值大小写方向正确。

这套测试保证了两张映射表始终闭合、可双向查找,是celery upgrade settings可靠性的根基。

注意事项与限制

  1. 新旧命名不可混用:loader 会自动检测配置使用的是新格式还是旧格式并据此解析,但这意味着你不允许在同一个配置里混用新旧设置名——除非你为两个替代名都提供了值(docs/history/whatsnew-4.0.rst)。迁移时应一次性完成。
  2. --django会补前缀:该选项会给原本没有前缀的设置统一加上CELERY_,例如BROKER_URL变为CELERY_BROKER_URL。如果目标项目本就不打算走 Djangonamespace='CELERY'路线,应使用默认模式而非--django
  3. --compat--django行为等价:从源码看,两者都只是把keyfilter切换为_compat_key,区别在于语义场景——--compat面向希望保留大写风格的非 Django 项目。
  4. 备份是默认行为:除非显式传入--no-backup,命令总会生成.orig备份;若对替换结果不满意,可用备份文件恢复。
  5. 文件必须可写且存在:命令以 UTF-8 读写文件;源码中_slurp留有 TODO 注释,尚未专门处理文件不存在的情况(celery/bin/upgrade.py),因此请确认目标文件路径正确。

小结

celery upgrade settings是 Celery 从 3.x 走向 4.x 命名体系时提供的自动化迁移工具,它的核心价值在于:以 celery/app/defaults.py 中的_TO_NEW_KEY映射表为唯一事实来源,逐行扫描并就地重写配置文件,同时默认保留.orig备份,兼顾了正确性与安全性。对普通项目使用默认模式即可获得全小写新命名;对 Django 项目,则配合--djangonamespace='CELERY'两步走,即可平滑过渡到官方推荐的前缀化配置风格。如需完整的设置项语义说明,可继续查阅 docs/userguide/configuration.rst 中的 Configuration Directives 章节;该命令的 API 文档位于 docs/reference/celery.bin.upgrade.rst。

  • 任务调度
  • 后端
  • 消息队列

【免费下载链接】celery

Distributed Task Queue (development branch)

项目地址:https://gitcode.com/gh_mirrors/ce/celery
点击查看免费下载
上一篇:如何快速搭建奈雪の茶风格小程序?nxdc-milktea前端模板完整指南
下一篇:Video2X 实用入门指南:视频超分辨率与帧率插值从入门到上手

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/20 13:18:01

Character Definitions - [Comic Title]

AI 技能AI 插件 【免费下载链接】baoyu-skills 项目地址: https://gitcode.com/gh_mirrors/ba/baoyu-skills 点击查看 免费下载 Style: [selected style] Art Direction: [Ligne Claire / Manga / etc.] Character 1: [Name] Role: [Protagonist / Mentor / Antag…

作者头像 李华
网站建设 2026/9/20 13:14:20

10 分钟用 TaoToken 跑通 Playwright MCP 的表格抓取技能

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/20 13:13:48

BrewUI UI测试框架详解:Page Object与Fixture驱动的完整指南

BrewUI UI测试框架详解:Page Object与Fixture驱动的完整指南 【免费下载链接】BrewUI 📺 Homebrews official macOS GUI 项目地址: https://gitcode.com/GitHub_Trending/br/BrewUI BrewUI 是 Homebrew 官方推出的 macOS 图形界面,让不…

作者头像 李华