用户:
jczzc查看:0 回复:0 评论:0 创建时间:2024-01-07T02:36:10
壹.先要条件
首先,本教程更新于24.1。此后celery和其依赖redis如有更新,请自行安装调试,本教程仅作参考。其次,如无特殊要求,本文所有url都将以UTF-8编码的数字元组(或列表)呈现,输入时请自行转换回去。
贰.安装与环境
celery库的本体可以直接pip安装
pip3 install "celery[redis]"
pip3 install greenlet
第二个是为了在win上支持异步
因为celery默认使用rabbitMQ,而这个东西我在mac上逝过,反正包大、网慢、不稳定,所以还不如下一个redis,全平台通用,速度也快,如果要用rabbitMQ的话,直接
pip install celery
也可以
redis有一个库:
pip install redis
不确定在用了第一个命令后还有没有用这个的必要,如果报错还是装一下为好
github下载页(runoob给的)
[104, 116, 116, 112, 115, 58, 47, 47, 103, 105, 116, 104, 117, 98, 46, 99, 111, 109, 47, 116, 112, 111, 114, 97, 100, 111, 119, 115, 107, 105, 47, 114, 101, 100, 105, 115, 47, 114, 101, 108, 101, 97, 115, 101, 115]
redis在下载完后,windows用户应记住每次启动都应在其zip解压到的目录下启动,不然.conf不用绝对路径会报错
启动redis服务器:
redis-server.exe redis.windows.conf
其中若是要在局域网开放端口,则应在redis.windows.conf中写明:
bind 127.0.0.1
bind [你自己的内网ip]
也就是在源文件(区区几百行)找到第一句(本来就有)后加上后面一句。同时记住设置MAC地址ip地址分配绑定(路由器设置),不然每次重启都要检查配置文件。
这时,celery运行的基本环境就搭建好了。
叁.基本构造与用法
一般讲,celery的用法主要分三步:
0:肯定要打开redis服务器啊
1:创建task
import time
from celery import Celery
broker = 'redis://localhost:6379/1' #任务储存的地方,/1是为了标注数据库,local host可以用本网段其他开放的redis服务器的ip
backend = 'redis://localhost:6379/2' #结果储存的地方
app = Celery(
'celeryDemo',
broker=broker,
backend=backend
)
@app.task
def add(x,y):
#这个函数可以是你自己定义的任意函数,只要加了装饰器就可以
print('task enter ....')
return x+y
3.启动worker:
celery worker -A tasks -l INFO
"""
其中tasks是你写的tasks.py文件,可以改文件名
"""
一台机器可以跑多个worker,正如redis可以存几个quene一样,进阶用法自行bing
这里有意思的是,可以有多个函数共用一个装饰器,同时进阶操作可以有定时操作(甚至远程),可以自己bing一下
celery的有意思之处在于,他似乎可以在多个机器上提供同样的服务,并且任务交付过程完全异步,高算力需求应用合理可以均衡一定负载,和redis配合得当可以处理大量任务。
这时我们改写tasks:
import time
from celery import Celery
broker = 'redis://localhost:6379/1' #任务储存的地方,/1是为了标注数据库,local host可以用本网段其他开放的redis服务器的ip
backend = 'redis://localhost:6379/2' #结果储存的地方
app = Celery(
'celeryDemo',
broker=broker,
backend=backend
)
@app.task
def add(x,y):
pass
此时从其他脚本调用
import task
response=task.add.delay(2,3)
#use this function to confirm if the result is OK
response.ready()
#use this function to get the result,if not,wait until the result is ready
response.get()
是的,此时函数只是声明形式的“虚参”,真正的计算过程是由承接任务的worker所在机器完成的
肆.尾声
本文所提及方法仅供入门参考,请各位大佬勿喷,celery本身是极复杂的系统,本文所提及的只是冰山一角而已,实践出真知,请以程序实际表现为准