起源

最近参加公司里的一个比赛,比赛内容里有一项是尽量使用分布式实现项目。因为项目最终会跑在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. Java动态代理(AOP)

    目录 一.代理 1. 什么是代理? 2. 使用代理模式的作用 3. 实现代理的方式 二.静态代理 1. 模拟用户购买u盘 2. 静态代理的缺点 三.动态代理 四. JDK 动态代理 1. Invoca ...

  2. CentOS 7.0删除mysql服务

    今天在Centos下安装mysql服务,就小记下,前面收藏了一篇安装的文档,我测试是可以用的,现在测试一下怎么删除 删除有两种方法,一种通过rpm -e进行删除 另一种通过yum remove 一.r ...

  3. 铁大树洞与市面上现有APP对比

    写在前面 铁大树洞这款APP严格来说并没有可以参照的对象,但如果非要说的话也可以有.这里我们选取百度贴吧进行对比. 百度贴吧 可以看到,百度贴吧的贴吧首页排版要更加好看,且在首页添加了各种分类.也许我 ...

  4. GIT pull 如何解决 fatal: refusing to merge unrelated histories

    在Github新建一个仓库,写了Readme.md,然后把本地一个已有内容的仓库上传. 先pull,因为两个仓库不同,发现refusing to merge unrelated histories,无 ...

  5. linxu系统安装WordPress

    确保在安装wordpress之前,安装了nginx,php,mysql 没有安装的翻我之前的博文有安装方法 进入官网下载压缩包 wget https://wordpress.org/latest.ta ...

  6. NoisyStudent:

  7. 文件上传控件bootstrap-fileinput中文设置没有效果的情况

    1.引入zh.js顺序错误 zh.js需放到fileinput.js下面 2. 组件创建语法错误 (class=“file”) 如果你使用js初始化fileinput组件,那么在html元素中应删除 ...

  8. hdfs学习(一)

    一.hdfs概述 介绍: 在现代的企业环境中,单机容量往往无法存储大量数据,需要跨机器存储.统一管理分布在集群上的文件系统称为分布式文件系统 .HDFS(Hadoop Distributed File ...

  9. css中关于:nth-child()和:nth-of-type()的深入理解

    css中关于:nth-child()和:nth-of-type()的深入理解 在css中有这样一类属性,是以:nth-开头的,其中最常见的就是:nth-child() 和 :nth-of-type() ...

  10. 图论算法(四)Dijkstra算法

    最短路算法(三)Dijkstra算法 PS:因为这两天忙着写GTMD segment_tree,所以博客可能是seg+图论混搭着来,另外segment_tree的基本知识就懒得整理了-- Part 1 ...