celery-redis 的测试demo

celery 安装
sudo pip3 install celery

redis安装

sudo apt install redis-server

 

redis 启动

redis-server

 

测试redis是否启动

user@host: ~$ redis-cli
127.0.0.1:6379> ping
PONG

 

如图创建 celery_app_1.py 文件

 

在__init__.py中

# -*- coding: utf-8 -*-
from celery import Celery

app = Celery('app_1')  # 创建 Celery 实例
app.config_from_object('celery_app_1.celeryconfig')

在celeryconfig.py中

from datetime import timedelta

from celery.schedules import crontab

CELERY_ANNOTATIONS = {'tasks.add': {'rate_limit': '2/s'}}

# 低优先级
CELERY_ROUTES = {
    'tasks.add': 'low-priority',
}

# broker
BROKER_URL = 'redis://127.0.0.1:6379/10'

# backend
CELERY_RESULT_BACKEND = 'redis://localhost:6379/11'

CELERY_TASK_SERIALIZER = 'msgpack'  # 任务序列化和反序列化使用msgpack方案

CELERY_RESULT_SERIALIZER = 'json'  # 读取任务结果一般性能要求不高,所以使用了可读性更好的JSON

CELERY_TASK_RESULT_EXPIRES = 60 * 60 * 24  # 任务过期时间

CELERY_ACCEPT_CONTENT = ['json', 'msgpack']  # 指定接受的内容类型

CELERY_TIMEZONE = 'Asia/Shanghai'

CELERY_IMPORTS = (  # 指定导入的任务模块
    'celery_app_1.task1',
    'celery_app_1.task2'
)

# schedules
CELERYBEAT_SCHEDULE = {
    'add-every-30-seconds': {
        'task': 'celery_app_1.task1.myadd',
        'schedule': timedelta(seconds=5),  # 每 30 秒执行一次
        'args': (5, 8)  # 任务函数参数
    },
    'multiply-at-some-time': {
        'task': 'celery_app_1.task2.mymul',
        'schedule': crontab(hour=9, minute=50),  # 每天早上 9 点 50 分执行一次
        'args': (3, 7)  # 任务函数参数
    }
}

在task1.py 中

import time

from celery_app_1 import app


@app.task
def myadd(x, y):
    time.sleep(4)
    return x + y

在task2.py中

import time

from celery_app_1 import app


@app.task
def mymul(x, y):
    time.sleep(4)
    return x * y


if __name__ == '__main__':
    app.start()

在client.py 中

# -*- coding: utf-8 -*-
import time

'''此模块测试'''

from celery_app_1 import task1
from celery_app_1 import task2


t1 = task1.myadd.apply_async(args=[2, 8])        # 也可用 task1.add.delay(2, 8)
t2 = task2.mymul.apply_async(args=[3, 7])   # 也可用 task2.multiply.delay(3, 7)
print('hello world')


i = 0
while 1:
    time.sleep(1)
    i += 1
    print('第', i, 'second')
    if t1.ready():
        print(t1.get())
    if t2.ready():
        print(t2.get())

    if t1.ready() and t2.ready():
        break

 

 

 

在终端运行以下命令启动 celery

celery -A tasks worker --loglevel=infcelery -A tasks worker --loglevel=info

启动成功的结果如上图

 

在终端输入 ipython3 进入ipython 命令行模式,导入

调用,并获取结果

 

启动client.py,python3 client.py,结果如下

hello world
第 1 second
第 2 second
第 3 second
第 4 second
10
21

 

定时任务

在开启一个窗口,输入 celery beat -A celery_app_1,启动成功的结果如下:

定时任务的程序已在 CELERYBEAT_SCHEDULE 中写好,所以这里只开启就好了

在主任务的窗口中可以看到每5秒执行一次的定时任务:

 

如果想直接在主程序启动的时候就启动定时任务,可以在用 -B参数启动

celery -A celery_app_1 worker -B --loglevel=info

 

 

参考资料

https://zhuanlan.zhihu.com/p/22304455

https://funhacks.net/2016/12/13/celery/

https://blog.youkuaiyun.com/happyAnger6/article/details/53889599

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值