celery
更深入的探讨。
本人MAC,Windows很久以前做过测试大差不离,貌似只有celery
启动那块有点问题。
Flask 1.1.1
Flask-Celery 2.4.3
Flask-Celery-Helper 1.1.0
celery 4.3.0
redis 3.3.8
我用的redis
,好像大多数同学都是用的rabbitmq
,我也尝试了应该都差不多。
一定要注意版本
因为版本的原因我踩了不少坑,一开始redis没升级,遇到这样的报错:
[外链图片转存失败(img-gTmVN6QZ-1567159867643)(evernotecid://4243B327-03CA-4132-8635-6F50A3036BB8/wwwevernotecom/150570492/ENResource/p1345)]
然后就是网上好多资料说flask-celery-helper
不支持celery4.0+
导致一开始用的老版本,遇到了定时任务不能触发的问题,一顿Google(今天一大半的时间都花在这个上面了),后面索性全部用最新版本了。
# CELERY_BROKER_URL = 'amqp://guest@localhost//'
CELERY_BROKER_URL = 'redis://:YOURPASSWORD@localhost:6379/0'
# CELERY_RESULT_BACKEND = "amqp://guest@localhost//"
# CELERY_RESULT_BACKEND = 'redis://:YOURPASSWORD@localhost:6379/0'
result_backend = 'redis://:YOURPASSWORD@localhost:6379/0'
这个配置文件要注意个问题,我一开始使用的key
为CELERY_RESULT_BACKEND
不过在启动的时候遇到了报错
[外链图片转存失败(img-WCyAoyDa-1567159867645)(evernotecid://4243B327-03CA-4132-8635-6F50A3036BB8/wwwevernotecom/150570492/ENResource/p1344)]
猜测大概原因是因为celery
版本不同,参考资料中使用的老版本celery
对应的就是CELERY_RESULT_BACKEND
。按照提示修改为result_backend
后,执行成功。
from flask_celery import Celery
celery_app = Celery()
这个不需要解释,就是实例化下Celery。
from app.libs.celery import celery_app
import datetime
@celery_app.task
def test():
f = open('/Users/aison/Documents/code/CeleryDemo/test.txt', 'w')
f.write(str(datetime.datetime.now()))
f.close()
这是一个测试用的任务。
from app.libs.celery import celery_app
# def configure(app):
# deploy_env = os.environ.get('DEPLOY_ENV', None)
# if deploy_env == 'prd':
# app.config.from_object(config.ProductConfig)
# elif deploy_env == 'pre':
# app.config.from_object(config.PreConfig)
# elif deploy_env == 'test':
# app.config.from_object(config.TestingConfig)
# elif deploy_env == 'pretest':
# app.config.from_object(config.PreTestingConfig)
# else:
# app.config.from_object(config.DevelopConfig)
def create_app(flask_config_name=None, **kwargs):
app = Flask(__name__, **kwargs)
# configure(app)
celery_app.init_app(app)
app.register_blueprint(bp_index)
return app
留了一个create_app
没用的我都注释或删除掉了,主要就是celery_app.init_app(app)
。
from app import create_app
from app.libs.celery import celery_app
from celery.schedules import crontab
from app.jobs import sync_app, test
flask_app = create_app()
celery_app.conf.update(
timezone='Asia/Shanghai',
enable_utc=True,
beat_schedule={
"sync_app": {
"task": "app.jobs.syncApps.sync_app",
"schedule": crontab(minute='*/1', hour='*'),
},
"test": {
"task": "app.jobs.test_task.test",
"schedule": crontab(minute='0', hour='18'),
},
}
)
定义定时任务的执行时间等配置。我看网上清一色的用timedelta(seconds=3)
也不知道谁抄谁的,不过都一样用就是了。。。
启动定时任务时,Windows与MAC相同:
celery -A celery_worker.celery_app beat --loglevel=debug
有一个需要注意的地方就是celery_worker
的层级问题,如果你在celery_worker.py
的同级目录运行命令行启动就用celery_worker.celery_app
,如果celery_worker.py
是被包在app
目录下,而你在app
目录同级的地方运行启动命令,就需要用app.celery_worker.celery_app
异步任务的就不详细说了,网上资料很多。
很久以前我Windows上也踩过celery
异步任务命令行启动的坑,最后用的是
celery -A celery_worker.celery_app --pool=solo worker --loglevel=DEBUG