使用文件系统作为代理时,Celery worker 创建“control”文件夹

4 投票
1 回答
47 浏览
提问于 2025-04-14 17:49

我有一个项目,使用Celery和Redis来管理任务。为了本地开发,我想把Celery的消息中间件从Redis换成文件系统。不过,当我运行Celery工作进程时,它会在根目录下创建一个叫control的文件夹,里面有以下内容:

/control
├── celery.pidbox.exchange
├── Q1.exchange
├── Q2.exchange
├── ...

我找不到任何关于这个文件夹是什么以及它具体用来干嘛的资料。我的目标是把这个文件夹移动到其他地方(比如.celery/文件夹),这样它就不会在根目录下了。

这是我的Celery配置:

class CeleryLocalConfig:

    include = ["app.tasks"]
    broker_url = "filesystem://"
    result_backend = "file://.celery/broker/results"
    broker_transport_options = {
        "data_folder_in": ".celery/broker/out",
        "data_folder_out": ".celery/broker/out",
        "queue_order_strategy": "sorted"
    }

celery_app = Celery(__name__)
celery_app.config_from_object(CeleryLocalConfig)

到目前为止,我尝试过:

  • 从根目录以外的其他目录运行Celery工作进程,但这样工作进程就收不到任何任务。

  • 在运行Celery工作进程时提供--workdir参数,但这似乎导致Celery工作进程和Celery应用之间的路径不一致,因此失败了。

1 个回答

1

设置一个 control_folder 字段对我来说解决了问题:

CELERY_BROKER_TRANSPORT_OPTIONS = {
    "data_folder_in": os.path.join(BASE_DIR, ".celery"),
    "data_folder_out": os.path.join(BASE_DIR, ".celery"),
    "control_folder": os.path.join(BASE_DIR, ".celery"),
}

所以对你来说,我想应该是:

broker_transport_options = {
    "data_folder_in": ".celery/broker/out",
    "data_folder_out": ".celery/broker/out",
    "queue_order_strategy": "sorted",
    "control_folder": ".celery/broker/out",
}

撰写回答