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
s1.py
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时间
s2.py
# 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('任务未执行或失败')
s3.py

 

四、使用多目录结构

创建一个目录里面放置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
celery_tasks/celery.py
from .celery import cel

@cel.task
def hello(x,y):
    return 'ok'
celery_tasks/tasks.py
from celery_tasks.tasks import hello

# 执行并获取任务ID
result = hello.delay(4, 4)
print(result.id)
s1.py
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('任务未执行或失败')
s2.py

 

posted on 2018-05-28 22:46  运维小学生  阅读(293)  评论(0)    收藏  举报

导航