环境: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