最新版本的flask+celery定时任务的个人实践

最新版本的flask+celery定时任务的个人实践

文章目录

  • 最新版本的flask+celery定时任务的个人实践
    • 版本及环境
    • 代码详解
      • config.py
      • app.libs.celery.py
      • app.jobs.test_task.py
      • app.__init__.py
      • celery_worker.py
    • 命令行启动

网上找了好多资料,搞了一天,到处都是问题,很多资料都不是最新的了。于是结合各种资料,打算根据自己的项目写一个笔记,本人LOWB没有任何关于 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(今天一大半的时间都花在这个上面了),后面索性全部用最新版本了。

代码详解

config.py

# 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'

这个配置文件要注意个问题,我一开始使用的keyCELERY_RESULT_BACKEND不过在启动的时候遇到了报错
[外链图片转存失败(img-WCyAoyDa-1567159867645)(evernotecid://4243B327-03CA-4132-8635-6F50A3036BB8/wwwevernotecom/150570492/ENResource/p1344)]
猜测大概原因是因为celery版本不同,参考资料中使用的老版本celery对应的就是CELERY_RESULT_BACKEND。按照提示修改为result_backend后,执行成功。

app.libs.celery.py

from flask_celery import Celery


celery_app = Celery()

这个不需要解释,就是实例化下Celery。

app.jobs.test_task.py

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()

这是一个测试用的任务。

app.init.py

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)

celery_worker.py

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

你可能感兴趣的:(Flask,flask,celery,flask-celery,定时任务)