python中对celery的基本使用

python对celery的基本使用

  • 什么是celery
  • 使用场景:
  • 安装及使用
  • 演示效果
  • 命令启动
  • 注意:
  • 可能会遇到的错误

什么是celery

Celery 是一个简单、灵活且可靠的,处理大量消息的分布式系统,专注于处理异步任务队列,同时也支持任务调度。
分布式系统:一个系统应用由不同的组件构成,我们将不同组件架构在不同的服务器中,不同组件之间通过消息通信的方式来实现协调工作,其目的是利用更多的机器,处理更多的数据
python中对celery的基本使用_第1张图片
GiL锁:
在同一时刻同一个进程内只允许一个线程获得CPU的使用权,每次线程执行前都会去访问这个GIL锁,是为了线程安全和多线程之间的数据完整性和状态同步加的锁,所以在python中多线程并不能完全发挥cpu的性能。
解决办法有:使用多进程

选择进程+协程的原因:
协程可以处理IO密集型程序的效率问题,但是处理CPU密集型不是它的长处,如要充分发挥CPU利用率可以结合多进程+协程。

使用场景:

celery是一个强大分布式任务队列的异步处理框架,它可以让任务的执行完全脱离主程序,甚至可以被分配到其他主机上运行。我们通常使用它来实现异步任务(async task)和定时任务(crontab)。

异步任务:将耗时操作任务提交给Celery去异步执行,比如发送短信/邮件、消息推送、音视频处理等等

定时任务:定时执行某件事情,比如每天数据统计

安装及使用

celery安装命令:

pip install celery

中间件我使用的是redis(官方推荐的是RabbitMQ),所以需要(这里下载的是redis的驱动,没有redis还得安装)

中间件驱动安装(redis)

pip install redis

因为celery应用到了协程,协程在使用的使用需要用猴子补丁,具体解决方式是,首先下载eventlet
猴子补丁下载

pip install eventlet

上面的包下载完成后我们需要启动celery的命令

演示效果

创建异步执行文件celery_task

import celery
import time
backend='redis://127.0.0.1:6379/1'    # 设置redis的1数据库来存放结果
broker='redis://127.0.0.1:6379/2'      # 设置redis的2数据库存放消息中间件
cel=celery.Celery('test',backend=backend,broker=broker)
    # 参数说明:第一个是celery的名字,这个celery和哪个项目相关就命名哪个
    # 后面两个关键字参数则是指定消息中间件和结果存放位置。


@cel.task
def send_email(name):
    print("向%s发送邮件..."%name)
    time.sleep(50)
    print("向%s发送邮件完成"%name)
    return "ok"

@cel.task
def send_msg(name):
    print("向%s发送短信..."%name)
    time.sleep(50)
    print("向%s发送短信完成"%name)
    return "ok"

创建执行测试文件:

from celery_task import send_email, send_msg
#celery_task 是创建的异步执行文件

result1 = send_email.delay("张三")
print(result1.id)
result2 = send_email.delay("李四")
print(result2.id)
result3 = send_msg.delay("王五")
print(result3.id)
result4 = send_msg.delay("赵六")
print(result4.id)

获取异步执行结果

from celery.result import AsyncResult
from celery_task import cel

async_result=AsyncResult(id="275f43a8-a5bb-4822-9a90-8be3feeb3b4", app=cel)
# id是执行了测试文件来的,用于在redis数据库中取的结果

if async_result.successful():
    result = async_result.get()
    print(result)
    # result.forget() # 将结果删除
elif async_result.failed():
    print('执行失败')
elif async_result.status == 'PENDING':
    print('任务等待中被执行')
elif async_result.status == 'RETRY':
    print('任务异常后正在重试')
elif async_result.status == 'STARTED':
    print('任务已经开始被执行')

执行前我们需要启动celery,注意:只要修改代码必须得重新启动服务

命令启动

celery --app=创建异步执行的文件名 -l INFO -P eventlet

运行测试文件结果:
python中对celery的基本使用_第2张图片
执行获取异步执行结果
python中对celery的基本使用_第3张图片

注意:

只要修改代码必须得重新启动服务

如果我们代码有语法错误,它是不会影响到程序,只是执行结果不是和正常的一样,例如:
python中对celery的基本使用_第4张图片

可能会遇到的错误

python中对celery的基本使用_第5张图片
报错的原因是
celery用到了协程,协程在使用的使用需要用猴子补丁,解决办法

pip install eventlet

还有一个错误就是提醒你没有redis属性,(忘了截图)看有没有redis数据库,有的话还需要下载驱动,没有就下redis,和驱动

pip install redis

python中对celery的基本使用_第6张图片
报这个错的原因是启动命令中的app没有指定对文件
在这里插入图片描述
这个文件名换成创建异步执行文件的文件名称

你可能感兴趣的:(异步框架,python,异步框架,celery)