起源

最近参加公司里的一个比赛,比赛内容里有一项是尽量使用分布式实现项目。因为项目最终会跑在jetsonnano,一个贼卡的开发板,性能及其垃圾。而且要求使用python?

找了很多博客,讲的真的是模棱两可,最后结合官方文档终于啃出来,写出来分享一下。

目前本博客的几个要点:

  1. 使用celery实现分布式
  2. 结合flask框架使用
  3. 使用Redis作为broker
  4. 使用Redis作为backend

准备工作

安装环境

需要安装的环境包括Redis、Celery、Pyhton3.6.9「开发板自带」

这里需要填坑的是Redis的设置。因为在腾讯云服务器、华为云服务器、滴滴云服务器上做的测试「穷,每个平台褥点羊毛」,一开始不知道在安全组里面开放端口,一直连接不上服务器,很坑。这里如果没有使用云服务器的话可以跳过安全组这一步的设置,使用了云服务器的话,一件开放一下端口,自行百度开放方法。

首先是Redis的设置,Redis需要把默认的120.0.0.1 IP地址修改为0.0.0.0,并把守护进程关闭。

vim redis.conf
bind = 0.0.0.0
protected -mode no //从yes改为no

安装celery

pip3 install celery -i https://pypi.tuna.tsinghua.edu.cn/simple

一个简单的分布式Demo

网上关于创建Celery文件的描述都很模糊,这里我的理解是这样,首先看一下官方给出的Demo:

from celery import Celery

app = Celery('tasks', broker='pyamqp://guest@localhost//')

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

将这个文件命名为tasks.py

这段代码最关键的核心是app = Celery('tasks', broker='pyamqp://guest@localhost//')

既然是分布式,肯定要有worker,干活的人,也就是云服务器,在云服务器上需要做的事情是:celery -A tasks worker --loglevel=info

其中的celery -A *** worker --loglevel=info *** 就是worker要拿到任务的任务板标志,只有有个这个标志,worker才知道到底谁在发任务。

broker='pyamqp://guest@localhost//' 因为我使用redis来作为任务的存放容器,所以改为 broker='redis://guest@localhost//'

broker是存放任务的地方,所以我把发放任务的服务器的地址填进去: app = Celery('tasks', broker='redis://121.***.***.190:6379')

6379为默认的端口号,其实broker这段url应该包括redis的用户名、用户密码+IP地址。因为我们前面修改的redis的配置文件,所以这里可以无密码访问。

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

这一段就是服务器要发送出去的任务了。当然服务器里不需要包含执行任务所需要的库,库安装在worker的服务器里就可以了。「当然add(x,y)啥库也不需要」。

现在可以来见识一下celery的威力了,把上面修改后的tasks.py放到worker服务器上面,执行命令:celery -A tasks worker --loglevel=info

你会看到下面这行:

(base) zhaosi@zhaosideMBP *** % celery -A tasks worker --loglevel=info

 -------------- celery@zhaosideMBP v4.4.7 (cliffs)
--- ***** -----
-- ******* ---- macOS-10.15.6-x86_64-64bit 2020-09-05 14:35:13
- *** --- * ---
- ** ---------- [config]
- ** ---------- .> app: tasks:0x7fd0bb1b16a0
- ** ---------- .> transport: redis://121.***.***.190:6379/8
- ** ---------- .> results: redis://121.***.***.190:6379/7
- *** --- * --- .> concurrency: 8 (prefork)
-- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
--- ***** -----
-------------- [queues]
.> celery exchange=celery(direct) key=celery [tasks]
. tasks.add [2020-09-05 14:35:15,566: INFO/MainProcess] Connected to redis://121.***.***.190:6379/8
[2020-09-05 14:35:15,773: INFO/MainProcess] mingle: searching for neighbors
[2020-09-05 14:35:17,484: INFO/MainProcess] mingle: all alone
[2020-09-05 14:35:18,789: INFO/MainProcess] celery@zhaosideMBP ready.

当你看到最后四行时,YES,最简单的Demo被你跑起来了

[tasks]
. tasks.add

这里展示的是worker可以接到的任务,当然现在服务器还没有发布任务,worker在持续监听服务器上存储发布任务的redis数据库,等着接活。

验收成果

打开云服务器,准备发布任务「请在服务器上也创建一个tasks.py,不需要安装任何依赖」

root@-x:~/pro# python3
Python 3.6.9 (default, Jul 17 2020, 12:50:27)
[GCC 8.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from tasks import add
>>> add.delay(1,1)
<AsyncResult: 71c49a0e-2d52-444e-b158-1ae9f1486767>
>>>

回到worker服务器,可以看到任务被接收并且完成了!

[2020-09-05 14:41:10,138: INFO/MainProcess] Received task: tasks.add[71c49a0e-2d52-444e-b158-1ae9f1486767]
[2020-09-05 14:41:10,223: WARNING/ForkPoolWorker-8] 2

可以通过result来接受结果:

>>> result = add.delay(1,1)
<AsyncResult: 71c49a0e-2d52-444e-b158-1ae9f1486767>
>>> result.get()
2

更复杂的返回值请各位自行探索啦

所谓万事开头难,有了这个Demo的帮助,后续的任务会简单很多。

后续

还是官方文档好啊。现在大多数博客写的是个啥。

基于Celery在多台云服务器上实现分布式的更多相关文章

  1. Linux学习2-在阿里云服务器上部署禅道环境

    前言 以前出去面试总会被问到:测试环境怎么搭建?刚工作1-2年不会搭建测试环境还可以原谅自己,工作3-5年后如果还是对测试环境搭建一无所知,面试官会一脸的鄙视. 本篇以最简单的禅道环境搭建为例,学习下 ...

  2. 阿里云服务器上安装mysql的心路历程(博友们进来看看哦)

    在阿里云花了100买了一台云服务器,配置如下: CPU: 1核 内存: 512MB 数据盘: 0G 带宽: 1Mbps 阿里云服务器安装mysql搞得我想吐血,搞了一个多星期,现在才搞好,而且,还有许 ...

  3. 阿里云服务器上使用iptables设置安全策略

    转自:http://www.netingcn.com/aliyun-iptables.html 公司的产品一直运行在云服务器上,从而有幸接触过aws的ec2,盛大的云服务器,最近准备有使用阿里云的弹性 ...

  4. Ubuntu 云服务器上部署自己的 Rails 应用

    自学rails一段时间了,之前只用heroku部署了网站,想尝试把网站以一个更“正经”的方式呈现出来,就买了一个阿里云服务器.参考了网上部分rails部署教程,过程中也遇到了一些问题,所以在完成之后总 ...

  5. 阿里云服务器上通过Docker部署redmine

    背景:在日常工作的过程中会遇到各种各样的问题,每个问题来了之后需要花时间解决.这里就面临两个问题. 1:问题责任不明确,有时候会遇到数据库或者物理服务器的问题,这时候就需要把相应问题指派给相应的人,传 ...

  6. 使用Nginx+uwsgi在亚马逊云服务器上部署python+django项目完整版(二)——部署配置及相关知识

    ---恢复内容开始--- 一.前提: 1.django项目文件已放置在云服务器上,配置好运行环境,可正常运行 2.云服务器可正常连接 二.相关知识 1.python manage.py runserv ...

  7. 云服务器上搭建cobalt strike遇到的一些小问题

    一.前言: 当你兴高采烈的买了一台云服务器,迫不及待地想去搭建传说中的神器cobalt strike的时候,你可能会遇到以下的一些小问题,这里我会列出对应的解决方法. 二.遇到的一些小问题 1.上传文 ...

  8. 安装VMware vSphere 的目的就是在一台物理服务器上安装很多很多的虚拟机

    版权声明:本文为博主原创文章,未经博主允许不得转载. 我们安装VMware vSphere 的目的就是在一台物理服务器上安装很多很多的虚拟机,我们可以通过VMware vSphere Client直接 ...

  9. 在阿里云服务器上安装完成并启动Tomcat后,通过http不能访问--解决办法

    在阿里云服务器上安装完成并启动Tomcat后,通过http不能访问的原因是阿里云平台为了安全设置了安全组策略,必须我们授权的端口,其他计算机才能通过http访问 解决办法:(这里以阿里轻量应用服务器为 ...

随机推荐

  1. 静态集成腾讯TBS X5内核WebView,从微信提取新版30M浏览器内核打包进apk

    目录 前情提要 第一步:下载老版本SDK得到jar 获取SDK 集成SDK 步骤二.下载提取最新TBS X5内核 方法1:从微信中提取 方法2:App内内访问tbs调试页安装新内核 步骤三.集成内核到 ...

  2. 线程安全&Java内存模型

    目录 Java内存模型 关于线程安全 Volatile关键字 Synchronized锁 重入锁 Lock锁 死锁 乐观锁与悲观锁 乐观锁(适合多读场景) 悲观锁(适合多写场景) Java内存模型 J ...

  3. SpringBoot学习之整合Swagger

    Swagger介绍 1.什么是Swagger 作为后端程序开发,我们多多少少写过几个后台接口项目,不管是编写手机端接口,还是目前比较火热的前后端分离项目,前端与后端都是由不同的工程师进行开发,那么这之 ...

  4. C#LeetCode刷题之#530-二叉搜索树的最小绝对差(Minimum Absolute Difference in BST)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4123 访问. 给定一个所有节点为非负值的二叉搜索树,求树中任意两 ...

  5. 提前批笔试一道算法题的Java实现

    题目描述 这是2021广联达校招提前批笔试算法题之一. 我们希望一个序列中的元素是各不相同的,但是理想和显示往往是有差距的.现在给出一个序列A,其中难免有相同的元素,现在提供了一种变化方式,使得经过若 ...

  6. 【译】gRPC-Web for .NET now available

    .NET 的 gRPC-Web 现在正式发布了.我们在一月份发布了实验版,从那时起,我们就根据早期的用户反馈进行着改进. 有了这个版本,gRPC-Web 就变成了 grpc-dotnet 项目的一个完 ...

  7. 使用动态链接为什么还需要静态库lib文件

    在Windows上使用动态链接时,不光需要头文件 .dll文件 还需要一个.lib 文件. 不是动态链接吗?为什么还需要静态库.lib文件? 实际上,这个.lib文件并不是静态库,而是 导入库 文件, ...

  8. 【算法•日更•第十二期】信息奥赛一本通1585:【例 1】Amount of Degrees题解

    废话不多说,直接上题: 1585: [例 1]Amount of Degrees 时间限制: 1000 ms         内存限制: 524288 KB提交数: 130     通过数: 68 [ ...

  9. 编译gawk出现问题,没有安装gawk。

    今天编译kernal的时候出现了一个错误:GNU awk is required for lib/memtype.h made by memtypes.awk..查了资料,原来是没有安装gawk的缘故 ...

  10. JavaScript学习系列博客_19_JavaScript中方法(method)

    方法 - 听了不少调用什么什么方法,所以方法究竟是啥东西? - 如果一个函数作为一个对象的属性保存,那么我们称这个函数时这个对象的方法,调用这个函数就说调用对象的方法(method). 创建一个对象 ...