Linux系统管理大作业: 利用Celery 实现分布式计算

零、预备知识

1 Celery基础

  Celery是一个使用Python实现的异步任务队列/基于分布式消息传递的作业队列.
  Celery的架构由三部分组成:
    消息中间件 (broker)
    任务执行单元(worker)
    任务执行结果存储(result)

  使用celery包含三个方面:
    1. 定义任务函数。
    2. 运行Celery服务。
    3. 客户应用程序的调用。

2 本文环境

  主要有三方面
    两个Ubuntu 18.04
    Python3
    pip3

3 本文实现的步骤

  一、配置Node1(发任务以及中间件)
    1.安装配置启动Redis(当做中间件并且存储结果)
    2.安装Celery
  二、配置Node2(用来接收完成任务)
    1.安装Redis(无需配置)
    2.安装Celery
  三、编写Python程序
    1.编写Worker上的程序
    2.编写向中间件发布任务的程序
  四、运行



下面是正文


一、配置node1(发任务以及中间件)

1.安装配置启动Redis

1.1 安装Redis及python库

stfnode1@ubuntu:~$ sudo apt-get install redis-server
stfnode1@ubuntu:~$ pip3 install redis

1.2 配置Redis

注意看注释
#通过这个命令获取node1的IP地址,并且记住
stfnode1@ubuntu:~$ ifconfig 
#我的IP是192.168.30.139
stfnode1@ubuntu:~$ sudo vim /etc/redis/redis.conf
#找到bind 127.0.0.1 ::1在69行左右
#将127.0.0.1 改为自己的IP地址
# ::1 删掉
#其余地方不用改动,直接保存退出

1.3 带配置文件启动Redis

sudo redis-server /etc/redis/redis.conf

2.安装Celery

sudo apt install python-celery-common

到这里Celery就安装完成了


二、配置Node2(用来接收完成任务)

1.安装Redis及python库(无需配置)

stfnode2@ubuntu:~$ sudo apt-get install redis-server
stfnode1@ubuntu:~$ pip3 install redis

2.安装Celery

stfnode2@ubuntu:~$ sudo apt install python-celery-common
stfnode2@ubuntu:~$ pip3 install celery[redis]


到这里环境就该配置完了
接下来开始编写Python程序 ↓

三、编写Python程序

1.编写node1上的程序

①新建一个tasks.py,内容如下:

from celery import Celery
# 注意: 这里*.*.*.*替换成配置文件中修改的地址即可
app = Celery('tasks',broker='redis://*.*.*.*:6379',backend='redis://*.*.*.*:6379')

@app.task
def add(x, y):
    return x + y

②新建Runtasks.py,内容如下:

from tasks import add
from celery.result import AsyncResult
import redis
import time

a = int(input("input first number:"))
b = int(input("input second number:"))

id_my=add.delay(a,b)

time.sleep(1)

res=AsyncResult(str(id_my)) # 参数为task id
print(str(id_my))
print(res.result)

注意:这里的tasks.py以及Runtasks.py应在同一个目录(也就是文件夹)下
注意:tasks.py里面*.* .*.*记得替换成配置文件中修改的地址
注意:建议不要退出当前目录

2.编写node2上的程序

node2作为worker, 时刻监听着node1上中间件发布任务,并且在完成任务之后将数据返回到node1的redis上。
新建一个tasks.py,内容如下:

from celery import Celery
# broker设置中间件,backend设置后端存储
app = Celery('tasks',broker='redis://*.*.*.*:6379',backend='redis://*.*.*.*:6379')
@app.task
def add(x,y):
  return x+y

注意:建议不要退出当前目录!
注意:tasks.py里面*.* .*.*记得替换成配置文件中修改的地址

四、运行

1. 在node2上的celery上运行任务

  在tasks.py所在目录下运行如下命令,此刻node2上的celery就会一直在监听node1上中间件分配的任务

celery -A tasks worker --loglevel=info

结果如下
在这里插入图片描述

2.node1发布任务

  在tasks.py以及Runtask.py所在目录下运行如下命令, 运行Runtask.py

python3 Runtasks.py

3.查看结果

  此刻可以在node2上看到结果,如下图
在这里插入图片描述


参考文章

  1. Ubuntu16.04下,erlang安装和rabbitmq安装步骤
  2. Python 并行分布式框架 Celery - 擒贼先擒王
  3. Celery 初步-官方文档
  4. 使用 RabbitMQ- Celery 3.1官方文档
  5. Python并行分布式框架Celery详解(这是下一步要做的)
  6. 开启redis-server提示 # Creating Server TCP listening socket *:6379: bind: Address already in use–解决方法
  7. python+celery报错:consumer: Cannot connect to redis://127.0.0.1:6379/10: Error 111 connecting
  8. 基于Celery在多台云服务器上实现分布式
  9. Celery |烧瓶错误:应为byteslike对象,但找到AsyncResult
  10. celery获取任务执行结果
  11. 如何查看Celery存储在redis里面的结果?
  12. python – redis连接与使用
  13. Python实现延时操作的几种方式
  14. Python 拼接字符串的几种方式
  15. python数据存储Excel
  16. modulenotfounderror: no module named 'xlwt’解决方案 python padans 输出excel出错

能力有限,有错误敬请指出

猜你喜欢

转载自blog.csdn.net/Stanford_sun/article/details/121418923