celery-01、生产者消费者模式介绍 以及 以及 celery自动后台实现任务部署和异步调用

--虚拟机设置不黑屏:【非常有用,我差点让输密码输疯掉了】【置定设置】
    --点击开关
    --点击修理图标
    --选择 power
    --选择blank screen中never永不锁屏即可
--再也不用输密码啦

--alt + ctrl + 左击/右击  # 对桌面进行切换

01、消费者和生产者模式

--基本解释:
    1、由生产者生成元素存入队列中,消费者不断问讯取出生成的元素做处理

--实际意义:
    1、常见的解耦方式之一,找到中间人broker,使得两个任务之间没有直接联系

--应用:
    --生产者生成消息,缓存到消息队列中,消费者读取消息队列中的消息并执行。
    --这里消息队列一般是rabbitMQ | redis,非常好用的
    --redis会出现一个问题即突然断电会导致数据丢失,这里可以使用redis持久化策略部分解决问题,但会降低性能

    例如:
        商城登陆时,生成发送短信消息,缓存到消息队列中,消费者读取消息队列中的发送短信消息并执行。而不是等待消息发送之后,
我们再返回消息已发送

--生产者 消费者之间除了简单的逻辑还有以下问题待解决:
    --生产者生成的消息可以理解为一个带输入值的key值,input(num_01, str_01, str_02, ***)
    --消费者需要实现具体的任务逻辑:即从消息队列中取出key值,找到对应任务,用对应的输入和任务编号执行相应代码解决问题
    --高并发问题:就是生产者一次生产的消息数量过多
    --后台多任务处理:对应高并发的消息,后台如何处理多任务并发的情况,例如:增加容器存储消息、增加后台服务器[反正celery也是一个服务器,一定有很多方法解决后台分布式连接的问题]
    --耗时的任务有许多种,每一种之间有重复怎么办
    --取到消息之后什么时候执行,以什么样的方式执行

--以上这些问题可以使用原生的python进程、协程进行解决。但是如果使用celery则效率要高很多

02、celery初步介绍

--celery简介:
    --一个简单、灵活且可靠、处理大量消息的分布式系统,可以在一台或者多台机器上运行。
    --单个 Celery 进程每分钟可处理数以百万计的任务。
    --通过消息进行通信,使用消息队列(broker)在客户端和消费者之间进行协调。

--安装:pip install -U Celery
    ---U就是 --upgrade,意思是如果已安装就升级到最新版
    --pip install -h命令可以查看其它参数的作用

--celery将生产者--消费者设计模式封装起来,并提供接口

--总结:
    --celery相当于一个服务器,部署了各种预设好的任务,由它自己安排异步执行计划
        --定时任务:就是celery自己按照设置好的计划表执行服务器中各项任务,甚至可以一个任务的输出作为下一个计划任务的输入
        --异步任务:多用于解耦与项目主体关联不大的一些任务,或者耗时的任务。例如发送验证码,又比如像

03、celery -- 异步任务范例的创建:使用redis作为消息队列

--创建python文件夹 python_celery_redis_test

--在文件夹 python_celery_redis_test下,创建任务定义后的调度文件diaoyong.py,并输入以下代码:

# coding=UTF-8
from proj.tasks import add
import time

t1 = time.time()

r1 = add.delay(1, 2)
r2 = add.delay(2, 4)
r3 = add.delay(3, 6)
r4 = add.delay(4, 8)
r5 = add.delay(5, 10)

r_list = [r1, r2, r3, r4, r5]
for r in r_list:
    while not r.ready():
        pass
    print(r.result)

t2 = time.time()

print('共耗时:%s' % str(t2-t1))

--这个代码是为了对接下来启动的celery任务服务器进行调度的 py文件,一共定义了5个文件
--代码中是逐个调用,每个会sleep1秒,正常来说是5s左右。实际上应该是异步调用,执行时间实际为1s多

--在文件夹 python_celery_redis_test下,创建python文件夹 proj 【celery任务文件夹】

--在文件夹 python_celery_redis_test/proj下,创建app_test.py。这个是任务的详细入口

from celery import Celery

# 设置任务名称为 proj
# include参数必须为 list,每一个就是一个任务的python导入顺序 import proj.tasks
app = Celery('proj', include=['proj.tasks'])

# 这里是为了加载配置文件,'proj.celeryconfig' 也就是 import proj.celeryconfig
app.config_from_object('proj.celeryconfig')

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

--在文件夹 python_celery_redis_test/proj下,创建celeryconfig.py。这个是celery配置,也就是app_test.py文件中的app.config_from_object('proj.celeryconfig')

BROKER_URL = 'redis://:@localhost:6379/0' # 使用Redis作为消息代理

CELERY_RESULT_BACKEND = 'redis://:@localhost:6379/0' # 把任务结果存在了Redis

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

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

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

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

--在文件夹 python_celery_redis_test/proj下,创建tasks.py。这个才是真正定义celery做什么的文件也就是app_test.py文件中的app = Celery('proj', include=['proj.tasks'])

import time
from proj.app_test import app

# 这个装饰器是固定写法
@app.task
def add(x, y):
    time.sleep(1)
    return x + y

04、celery -- 异步任务范例的使用:

--鉴于windows下,celery已经非常不好用了,这里就不赘述了。希望你也别看了用不到的。
--windows下坑非常多,非常不建议去折腾没有意义

--启动终端 01
    --启动 celery服务器:
        --celery -A proj.app_test worker -l INFO  这个命令是为了能够看到执行的任务的输出
        --celery -A proj.app_test worker -l INFO  --logfile="celery.log"  这个命令启动之后不会看到输出,所有数据都在log中
        --celery -A proj.app_test worker -l INFO -P eventlet -c 1000  这个命令才是真正能够实现异步的命令,如果不是这样启动celery则无法发挥异步特性

--启动之后如下所示:

    --启动终端 02
        -- python3 diaoyong.py
    --最终结果如下:
        --这里不应该是 5 s,因为我是在虚拟机中做的,因此可能有问题,所以会在公司服务器中再试一次。这里应该是 1.01235812563871s 这样的 1.几s才对。毕竟celery是异步调度

        --异步调用失败是 启动命令错误导致的,建议参考上面启动命令中第三条

05、celery -- 异步任务范例的使用:使用守护进程的方式启动celery

--记住这里守护进程其实就是后台执行

********************************  01、supervisor安装  *******************************
pip install supervisor  ||  supervisord -v
********************************  02、supervisor配置如下  *******************************
--创建supervisord.conf文件,并输入以下代码,注意celery位置修改
--当然也可以直接使用 celery,因为celery安装时已经注册过
--这里就是使用的celery异步启动命令
[program:celeryd]
command=/opt/buildtools/python/bin/celery -A proj.app_test worker -l INFO -P eventlet -c 1000
stdout_logfile=/data/lwx898295/celery_test/time_sche/celeryd.log
stderr_logfile=/data/lwx898295/celery_test/time_sche/celeryd.log
autostart=true
autorestart=true
startsecs=10

[supervisord]
********************************  03、supervisord启动如下  *******************************
supervisord -c supervisord.conf
********************************  03、仍然像04中那样启动调试即可,只是此时运行内容放在日志文件  *******************************

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值