flask 中使用celery
目录结构如下:
init.py
from __future__ import absolute_import, unicode_literals
config.py
from datetime import timedelta
# celery配置
# 消息代理
BROKER_URL = 'redis://IP:6379/0'
# 存储任务执行结果
CELERY_RESULT_BACKEND = 'redis://IP:6379/1'
# 任务的序列化方式
CELERY_TASK_SERIALIZER = 'pickle'
# 任务执行结果的序列化方式
CELERY_RESULT_SERIALIZER = 'pickle'
# 任务过期时间
CELERY_TASK_RESULT_EXPIRES = 100
# 接受内容类型
CELERY_ACCEPT_CONTENT = ['json', 'pickle']
# 超时再分配时间
BROKER_TRANSPORT_OPTIONS = {'visibility_timeout': 100}
# 并发worker数量
CELERYD_CONCURRENCY = 4
# 防止死锁,应确保为True
CELERYD_FORCE_EXECV = True
# 禁用任务预取
CELERYD_PREFETCH_MULTIPLIER = 1
# 每个worker执行了多少任务就会死掉,避免内存泄露
CELERYD_MAX_TASKS_PER_CHILD = 100
# 时区设置,用于定时任务
CELERY_TIMEZONE = 'Asia/Shanghai'
CELERY_ENABLE_UTC = False
# 任务导入,包括异步任务和定时任务
CELERY_IMPORTS = (
'celery_tasks.tasks',
)
# 计划任务
CELERYBEAT_SCHEDULE = {
'test_reminders': {
# task就是需要执行计划任务的函数
'task': 'run_server.test',
# 配置计划任务的执行时间,这里是每60秒执行一次
'schedule': timedelta(seconds=60),
# 传入给计划任务函数的参数
'args': None
},
}
celery_init.py
from __future__ import absolute_import , unicode_literals
from celery import Celery
import time
celery_app = Celery('tasks')
celery_app.config_from_object('taskCenter.config')
task.py
from .celery_init import celery_app
import time
@celery_app.task(name='tasks.add')
def add(a, b):
print('开始')
time.sleep(100)
print('end')
return {'result': a+b}
celery启动命令
Windows:
celery -A application.taskCenter.celery_init:celery_app worker -P eventlet -l info
Linux下不需要eventlet
celery -A application.taskCenter.celery_init:celery_app worker -l info