我有一个django REST API设置在一台机器上(目前在本地机器上测试,但最终将在web服务器上)。我们称这台机器为"客户机"。我还有一台计算服务器,用于运行需要长时间执行的cpu密集型任务。我们把这台机器命名为run-server。
"run-server"运行一个连接到本地rabbitmq服务器的celery worker。worker当前在git模块中,结构如下:
proj/
client.py
cmd.sh
requirements.txt
tasks.py
这一切都是在虚拟环境中运行的。cmd.sh
基本上在"run-server"上执行celery multi start workername -A tasks -l info
。client.py
是一个cli脚本,可以从任何机器(即"客户端")的shell手动提交任务到"运行服务器"。
我想从django设置中运行等同于客户端的脚本,而不需要在django存储库中复制tasks.py
和client.py
代码。理想情况下,我将pip install proj
从django代码和导入项目使用它,就像客户端脚本一样。
我如何包装项目来实现这一点?
我习惯将自己的python模块打包,其结构大致如下:
proj/
bin/
proj
proj/
__init__.py
__main__.py
script.py
setup.py
requirements.txt
我设法让它自己工作。上面的结构可以正常工作。而不是celery multi start workername -A tasks -l info
,您只需替换为celery multi start workername -A proj.tasks -l info
,一切工作。相同版本的模块必须安装在django和worker中,因为作业队列是通过duck-typing完成的(即路径和名称必须匹配)