当前位置: 代码迷 >> 综合 >> Celery 异步调用方法改动记录
  详细解决方案

Celery 异步调用方法改动记录

热度:25   发布时间:2024-02-06 17:24:36.0

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 timefrom celery import Celeryapp = Celery(broker='amqp://guest@localhost//',  # 消息队列的urlbackend='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 timefrom celery import Celeryapp = Celery(broker='amqp://guest@localhost//',  # 消息队列的urlbackend='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 addfor i in range(50):add.delay(i, i + 10)

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

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

在远程调用的时候,

from celery import Celeryapp = 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