当前位置:网站首页>Celery 异步调用方法改动记录

Celery 异步调用方法改动记录

2022-06-10 13:39:00 tnan2522

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://[email protected]//',  # 消息队列的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://[email protected]//',  # 消息队列的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://[email protected]//',  # 消息队列的url
)

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



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

保存执行结果:

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

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

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

celery 发送邮件

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

原网站

版权声明
本文为[tnan2522]所创,转载请带上原文链接,感谢
https://blog.csdn.net/qq_42031243/article/details/107809451