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