flask Celery应用

本文介绍了如何在Windows环境下利用Flask集成Celery进行异步任务执行和定时任务设置。首先配置Celery的broker(以Redis为例),然后在Flask应用中创建Celery实例,接着在views函数中调用任务。对于定时任务,通过在config.py中配置Celery,创建tasks.py文件并设定任务名称。最后,提供了启动Celery worker和beat的两种方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

环境:win10

celery==4.2.1         flask==1.0.2       

1. 异步执行任务

1、设置celery的broker(以redis为例)

    # celery配置
    CELERY_BROKER_URL = 'redis://10.100.100.104:6379/0'
    CELERY_RESULT_BACKEND = 'redis://10.100.100.104:6379/1'


2、根据设置,将其配入到celery对象中
celery = Celery(__name__, broker=configs['test'].CELERY_BROKER_URL)

3、在工厂函数中加载celery配置文件

4、在APP中新建tasks.py文件如下:

from flask_mail import Message

from app import celery, mail


@celery.task
def send_mail_tasks():
    import time
    time.sleep(4)
    msg = Message('Hello',
                  # sender='*******@qq.com',
                  recipients=['******@163.com'])
    msg.html = '<h1>Hello World</h1>'
    mail.send(msg)
    return "Success"


5、对tasks任务的调用,在普通的views函数中:

@myapp.route('/mail', methods=['GET'])
def send_mail():
    tasks.send_mail_tasks.delay()
    return "send_mail success"

6、启动celery,请确保redis已经正常启动:
celery -A app.myapp.tasks worker --pool=solo -l info

 

2. celery定时任务

主要基于flask的工程。

1. 在config.py文件中添加celery配置:

    # celery配置
    CELERY_BROKER_URL = 'redis://127.0.0.1:6379/11'
    CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/12'
    CELERY_TASK_SERIALIZER = 'json'
    CELERY_TIMEZONE = 'Asia/Shanghai'
    CELERY_IMPORTS = (
        'app.myapp.tasks',    # 注意实际为app/myapp/tasks.py
    )
    CELERYBEAT_SCHEDULE = {
        'every-minute': {
            'task': 'celery_tasks.scan_uri',
            'schedule': crontab(minute='*/5'),  # beat task every 5min
            # 'args': (1,2),
            # 'schedule': timedelta(seconds=5)
        },
    }

2. 在工厂函数所在的__init__.py文件中新建celery实例,并将实例进行配置。

celery = Celery(__name__, broker=CELERY_BROKER_URL)

在creat_app工厂函数中进行配置加载:

def create_app(config_name):
    app = Flask(__name__)
    app.config.from_object(baseConfig[config_name])
    baseConfig[config_name].init_app(app)
    app.json_encoder = CustomJSONEncoder
    celery.conf.update(app.config)
    redis_store.init_app(app)
    mail.init_app(app)
    moment.init_app(app)
    db.init_app(app)

3. 在需要定时任务的BluePrint中新建tasks.py,内容如下:

注意:tasks.py的路径要注意跟 config.py 中的CELERY_IMPORTS 保持一致,此外,为该定时任务任意指定名字,name='celery_tasks.scan_uri'。对应CELERY_SCHEDULE中的 “task:'celery_tasks.scan_uri'”。

@celery.task(name='celery_tasks.scan_uri')
def scan_uri():            # 定时运行的任务
    print("start beat tasks...")
    result = beat_scan_s_uri()   
    return result

4、此外,flasky作者——miguelgrinberg ,推荐的一种启动celery-worker的做法,在项目根目录下创建文件celery_worker.py 

from app import create_app, celery

app = create_app('default')
app.app_context().push()

5、至此,celery所有的相关配置都已完成,接下来就是启动了。有2种方法可以启动定时任务,

其一:先启动worker, 在启动beat。

1、启动worker
    celery  -A app.my_app.tasks  worker --loglevel=info

 或者: celery worker  -A celery_worker.celery --loglevel=info
2、启动celery的定时任务
    celery beat -A app.my_app.tasks

其二:worker和beat一条命令一起启动。

celery worker -A celery_worker.celery -B --loglevel=info

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值