如何基于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
相关产品推荐
相关产品推荐

