Celery 异步调用方法改动记录

本文详细介绍了Celery 4.0版本在Python环境下的配置与使用方法,包括解决常见错误的步骤,如安装eventlet模块,以及如何正确设置任务队列名称避免异常。同时,讲解了如何在远程调用时指定任务队列,并说明了结果存储到Redis中的方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Celery 是一个任务队列, 可以异步处理
在4.0 版本后python使用celery 会出现种种错误, 这时候需要安装 eventlet模块

pip install eventlet

默认是

celery -A task worker --loglevel=info

启动celery

4.0后启动celery:

celery -A task worker --loglevel=info -P eventlet

在work 装饰器上也要改动

默认是:

import time

from celery import Celery

app = Celery(
    broker='amqp://guest@localhost//',  # 消息队列的url
    backend='redis://localhost:6379/9'  # 将调用的结果存储到Redis中

)


@app.task
def add(x, y):
    print("celery 接收到的数据是: ", x, y)
    print("x+y=", x+y)
    # time.sleep(100)
    return x + y

改为:

import time

from celery import Celery

app = Celery(
    broker='amqp://guest@localhost//',  # 消息队列的url
    backend='redis://localhost:6379/9'  # 将调用的结果存储到Redis中

)


@app.task(name="aaabbb")
def add(x, y):
    print("celery 接收到的数据是: ", x, y)
    print("x+y=", x+y)
    # time.sleep(100)
    return x + y

	

这样做是因为如果不给任务队列设置名字的话,队列会根据当前的模块名和方法名当做队列的名字, 如
aaabbb

在其他模块中导入使用是, 如

from celery_aabb.task import add


for i in range(50):
    add.delay(i, i + 10)

add.delay 给任务队列发送消息的时候发送给的队列是 celery_aabb.task.add, 这样就找不到对应的任务队列处理了,就会出现异常

如果设置了队列的名字,那么, 在导入add 使用的时候会使用celery 装饰命名的名字当做发送的任务队列的名字,这样就找到了任务处理队列

在远程调用的时候,

from celery import Celery


app = Celery(
    broker='amqp://guest@localhost//',  # 消息队列的url
)

app.send_task("aabbcc", [10, 20])



只需要写上命名任务队列就可以找到 celery 中启动的任务队列

保存执行结果:

backend='redis://localhost:6379/8'

将调用的结果存储到Redis中, 储存格式 是 json 序列化的字符串

在add 处理函数中会将return 返回值当做要保储的值储存到redis 中, 如果没有返回值,celery 也是会储存数据, 不过储存字符串中的restful为null

celery 发送邮件

在task 工作模块中导入其他模块,因为是在命令行模式启动的, 所以它只能够找当前目录下的文件和文件夹, 不能找到上一层的文件和文件夹,
需要将发送邮件的模块放到task 工作模块的目录下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值