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

如何基于PyInstaller编译后的Celery模块启动Celery Worker

如何启动PyInstaller编译后的Celery Worker?

嘿,我之前也踩过这个坑!用源码启动Celery Worker很顺手,但打包成单文件后,Celery的命令行工具没法直接识别这个可执行文件作为模块,得换个思路来启动。下面给你一步步讲清楚怎么做:

1. 给你的worker.py加个自启动入口

我们要让打包后的可执行文件自己能启动Worker,不用依赖celery命令行来加载模块。修改你的代码如下:

from celery import Celery
from celery.bin.worker import worker

app = Celery('celery')

@app.task(bind=True)
def some_task(self):
    print('HELLO WORLD')

if __name__ == '__main__':
    # 创建Worker实例,绑定我们的Celery app
    worker_cli = worker(app=app)
    # 设置启动参数,和你之前用命令行传的参数对应
    run_options = {
        'loglevel': 'info',
        # 要是需要其他参数,比如并发数,就加'concurrency': 4这样的键值对
    }
    # 启动Worker
    worker_cli.run(**run_options)

2. 重新用PyInstaller打包

还是用你原来的打包命令就行:

python3 -m PyInstaller --onefile worker.py

3. 直接运行打包好的可执行文件

打包完成后,去dist目录里找到生成的可执行文件(Linux/macOS下是worker,Windows下是worker.exe),直接运行它就搞定了:

./dist/worker

额外小提示

如果你想让打包后的文件支持动态传参数(比如临时改日志级别、指定队列),可以用argparse模块来解析命令行参数,把参数传到run_options里,这样灵活性更高。比如:

import argparse

# ... 保留原来的Celery app和任务代码 ...

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('-l', '--loglevel', default='info')
    parser.add_argument('-c', '--concurrency', type=int, default=1)
    args = parser.parse_args()
    
    worker_cli = worker(app=app)
    run_options = {
        'loglevel': args.loglevel,
        'concurrency': args.concurrency
    }
    worker_cli.run(**run_options)

这样打包后,你就能像这样传参数了:

./dist/worker -l debug -c 4

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 13:19:09