目前有个需求 需要提前缓存一些数据,那么使用celery
找个各种方法,显示在celery 不支持celery 下面分享我的配置 与启动办法 -------主干还是celery官网
也有很多异步循环的配置,这里只写不同的地方。
第一 环境: win64 + python3.5 + celery+ 3.1.25 + django-celery + redis + django
第二 根据官网配置
1. setting
2. 项目同名路径下添加初始化文件 celery.py 在项目中
3. 配置在项目同名目录下的init.py
4. 在apps目录下,或者其他目录下添加 task.py 文件(这个可以自己命名,只是为了更好的见名思意建议使用task)
5. 配置view
在Windows下 主要不同在于task.py 中的配置
rom __future__ import absolute_import
from celery import Celery
# 导入redis模块,通过python操作redis
import redis
import django_redis
import pymysql
import simplejson
# 创建celery客户端
# 参数一 指定任务所在的路径,从包名开始制定
# 参数二 指定任务队列(broker),这里使用的reids
app = Celery('tasks', broker='redis://localhost:6379')
app.conf.update(
# 配置所在时区
CELERY_TIMEZONE='Asia/Shanghai',
CELERY_ENABLE_UTC=True,
# 官网推荐消息序列化方式为json
CELERY_ACCEPT_CONTENT=['json'],
CELERY_TASK_SERIALIZER='json',
CELERY_RESULT_SERIALIZER='json',
# 配置定时任务
CELERYBEAT_SCHEDULE={
'inster': {
'task': 'celery_tasks.tasks.inster', # tasks.py模块下的add方法
'schedule': 5, # 每隔5运行一次
'args': (1, )
}
}
)
@app.task
def inster(tp):
print("1111111111111111111111111111111111111111111111111")
# 链接数据库
db = pymysql.connect(host="localhost", user="root", passwd="mysql", db="insauditdata", charset='utf8')
cursor = db.cursor()
# 链接redis池
pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(connection_pool=pool)
if tp == 1:
cursor.execute(
"select rt_bps, avg_bps from t_mem_net_flow order by interface_id")
results = cursor.fetchall() # 每查询一条数据返回一个元祖,装入大的元祖中
然后是配置views.py
在
pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True) #建立redis链接池
r = redis.Redis(connection_pool=pool) # 建立链接
res_range = r.lrange('1', 0, 59) # 取数据 取60个
str_res = res_range[0]
res = tuple(eval(str_res))
因为是循环定时任务 所以需要启动两个celery 命令
启动celery : celery -A celery_tasks.tasks worker --pool=solo (此命令在windows 下使用,其他命令多半会报错)
启动执行命令 :celery -A celery_tasks.tasks beat