celery框架|环境搭建及测试[celery+rabbitmq+redis]

 https://blog.csdn.net/geniusle201/article/details/86135282?utm_medium=distribute.pc_relevant.none-task-blog-searchFromBaidu-2.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-searchFromBaidu-2.control

 

1. celery 简介

关于celery的简介,网上一大堆,在此不做赘述。

举个不太恰当的例子来作说明。celery就是一个服务团队,进入一家餐馆开始服务后,他的厨子在不停地做菜,前台有多个顾客不停地在吃,只要桌子上没有菜了,就会有新做好的端上来,直至所有的菜都被吃完为止。
后台的厨子叫做broker,顾客叫做worker,而用来临时存放饭菜的桌子叫做消息队列(message queue),而洗碗池(此例中每名顾客吃完都会产生一个脏的盘子)叫做backend。

以分布式爬虫为例,当确定任务后,由broker将多个任务推送至消息队列,然后多个分布式的小爬虫不停地从消息队列中获取子任务进行执行,并将执行的结果存放至backend中。

这就是分布式框架celery的基本原理,简单吧?

非常值得一提的是,celery是个服务团队(框架),不是一家餐馆(程序),他不自带桌子(消息队列),也不提供洗碗池(backend),他只是面向这些桌子和洗碗池提供服务。在他的官网文档中推荐了一些目前服务对接比较稳定的桌子(消息队列)和洗碗池(backend),我摘录过来,如下所示。
官方文档推荐的几个broker

至于backend,个人推荐redis.

2. celery 安装及部署

2.1 celery 安装

首先通过pip安装(python3请通过pip3安装):

pip install celery
  • 1

然后在python代码中导入即可使用:

from celery import Celery
  • 1

后面要在terminal中启用celery,需执行如下命令:

sudo apt install python-celery-common
  • 1
2.2 rabbitmq 安装

执行如下命令即可安装rabbitmq:

//安装rabbitmq
sudo apt install rabbitmq-server
//开启rabbitmq一些需要用到的插件
sudo rabbitmq-plugins enable rabbitmq_management
//添加用户及密码
sudo rabbitmqctl add_user admin admin
//添加虚拟host
sudo rabbitmqctl add_vhost myvhost
//设置虚拟host的权限
sudo rabbitmqctl set_permissions -p myvhost admin '.*' '.*' '.*'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

完成以上步骤后,打开浏览器,访问 http://127.0.0.1:15672 并登录,即可进入rabbitmq管理后台。如下图所示:
rabbitmq后台界面

注意,这里很重要,如下图所示:
很重要

1.看好这几个路径的位置,后续开发中要经常查看日志和配置文件,路径也可以改为自己想用的。
2.记住这几个不同的监听的端口,比如:如果用celery访问rabbitmq则需访问5672,浏览器访问则是15672。

3. run起一个简单的demo

3.1 tasks.py 文件
import time
from celery import Celery

brokerUrl = 'amqp://admin:admin@localhost:5672/myvhost'
app = Celery('tasks',broker=brokerUrl)

@app.task
def add(x,y):
	print('sleep 2 seconds...')
    time.sleep(2)
    return x+y
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
3.2 在terminal中调用celery:

进入到tasks.py所在的目录,执行:

celery -A tasks worker --loglevel=info
//参数说明:-A参数表示的是Celery APP的名称,这个实例中指的就是tasks.py,后面的tasks就是APP的名称
//worker是一个执行任务角色,loglevel=info记录日志类型默认是info
//这个命令启动了一个worker,用来执行程序中add这个加法任务(task)
  • 1
  • 2
  • 3
  • 4

会看到如下反馈则说明已经启动了一个worker:
启动一个worker

3.3 调用woker并查看执行情况

写一个简单的 callworker.py 文件:

from celery import Celery
from tasks import add
add.delay(3,4)
add.delay(4,4)
  • 1
  • 2
  • 3
  • 4

运行 callworker.py,然后查看之前加载celery worker的那个terminal,可以看到刚才的callworker.py中的命令已被执行。反馈如下所示:
worker执行任务成功

至此,一个简单的celery框架安装部署、demo测试完成。