celery 定时任务使用
一、celery
假设有一个任务处理需要5秒钟,连接数达到最大后,请求就进不来了
应对此种情况,需要有代理接受任务的一方处理
每个连接将任务交给celery接收和管理,中途可以查看请求的执行情况。
需要提交任务ID得到任务处理的结果,或者还在处理中。
而任务ID存储在消息队列(任务ID代持者)的载体当中
任务需要工作者(wocker)来处理。
celery接受任务的同时,可以给任务设定时间处理,存储在队列中,工作者会了解再预设的时间来处理工作
程序中安装celery接收任务,任务id和对应的定时信息存储在消息队列,任务执行交给工作者处理

二、安装
pip3 install celery
pip3 install redis
windows需要安装:
pip3 install eventlet
三、示例
# 执行celery # celery worker -A s1 -l info -P eventlet # windows需要安装eventlet from celery import Celery # broker接收任务 # backend接收任务处理结果 app = Celery( 'tasks', broker='redis://192.168.31.101:6379', backend='redis://192.168.31.101:6379' ) @app.task def xxx(x,y): return x + y
from demo.s1 import xxx import datetime # 立即执行任务 # result = xxx.delay(4,4) # print(result.id) # 定时任务 # 获取当前utc时间 ctime = datetime.datetime.now() # ctime = datetime.datetime.now(year=2018,month=5,day=19,hour=17,minute=55) utc_ctime = datetime.datetime.utcfromtimestamp(ctime.timestamp()) s10 = datetime.timedelta(seconds=10) ctime_x = utc_ctime + s10 result = xxx.apply_async(args=[1,3],eta=ctime_x) print(result) # eta = 规定的执行时间,必须是utc时间
# 4aafbd26-e930-4999-a633-757c08f6d805 from celery.result import AsyncResult from demo.s1 import app async = AsyncResult(id="4aafbd26-e930-4999-a633-757c08f6d805",app=app) # 取消执行任务 # async.revoke(terminate=True) # terminate=True 及时正在执行的任务也中断 print(async.state) # print(async.status) 同上 # 状态分为: """ *PENDING* *STARTED* *RETRY* *FAILURE* *SUCCESS* """ if async.successful(): result = async.get() print(result) # async.forget() # 拿到结果就清空 else: print('任务未执行或失败')
四、使用多目录结构
创建一个目录里面放置celery相关的任务函数和连接redis等等。
目录中必须有一个celery.py的文件,文件中写连接相关代码
命令执行执行celery目录即可
celery worker -A celery_tasks -l info -P eventlet
from celery import Celery from celery.schedules import crontab cel = Celery('xxxxxx', broker='redis://192.168.11.91:6379', backend='redis://192.168.11.91:6379', include=['celery_tasks.tasks','celery_tasks.xxx']) # 定义的函数 # # 时区 # celery.conf.timezone = 'Asia/Shanghai' # # 是否使用UTC # celery.conf.enable_utc = False
from .celery import cel @cel.task def hello(x,y): return 'ok'
from celery_tasks.tasks import hello # 执行并获取任务ID result = hello.delay(4, 4) print(result.id)
from celery.result import AsyncResult from celery_tasks.celery import cel async = AsyncResult(id="da06dda8-2134-4a64-b40d-0e21b1cb867f", app=cel) if async.successful(): result = async.get() print(result) else: print('任务未执行或失败')
浙公网安备 33010602011771号