之前使用了uwsgi来单独启动flask, 然后再手动启动celery, 但是这样做着实有点麻烦, 伴随着公司今后多景区的接入, 运维成本就会越来越大, 所以尝试对uwsgi和项目结构做一些调整, 利用uwsgi直接启动celery, 并且将celery的代码转移回项目中, 做到一个景区对应一个celery队列, 而不再多景区共享celery.
首先对vassal配置文件进行修改, 借用uwsgi的smart-attach-daemon
, 我们可以轻松的做到启动celery, 只需要加一句
smart-attach-daemon = /tmp/celery_%(vassal_name).pid celery -A application.tasks worker --pidfile=/tmp/celery_%(vassal_name).pid
但是修改完以后就出现了如下错误 AttributeError: ‘Flask’ object has no attribute ‘user_options’
, 进行搜索后发现
The your_application string has to point to your application’s package or module that creates the celery object.
可问题就是application.tasks
的确就是生成celery的module, 于是想说尝试直接指向生成的celery object试试效果, 既修改vassal配置为
smart-attach-daemon = /tmp/celery_%(vassal_name).pid celery -A application.tasks.celery_app worker --pidfile=/tmp/celery_%(vassal_name).pid
上传更新后发现居然正常了, 重新排查原因, 原来是我在application.tasks
中将application.flask_app
定义成了app
, 而celery会默认寻找app
这个对象作为celery的对象, 所以才会出现启动celery时候出现Flask
的错误.