猫史档案馆


【Python】celery实装简易入门

用户:jczzcjczzc查看: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本身是极复杂的系统,本文所提及的只是冰山一角而已,实践出真知,请以程序实际表现为准

 


回复

上一页1 页 / 共 0下一页